程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 棧的壓入壓出

棧的壓入壓出

編輯:C++入門知識

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。 輸入: 每個測試案例包括3行: 第一行為1個整數n(1<=n<=100000),表示序列的長度。 第二行包含n個整數,表示棧的壓入順序。 第三行包含n個整數,表示棧的彈出順序。 輸出: 對應每個測試案例,如果第二個序列是第一個序列的彈出序列輸出Yes,否則輸出No。 樣例輸入: 5 1 2 3 4 5 4 5 3 2 1 5 1 2 3 4 5 4 3 5 1 2 樣例輸出: Yes No 代碼AC: 思想:掃描 + 入棧 + 彈棧:當前的輸出==棧頂元素,彈棧,若當前輸出的不是棧頂元素,那麼就要將元素入棧直到此元素,如果入棧中沒有發現此元素,那麼就是錯誤的序列。 [cpp]   #include <stdio.h>   #include <stdlib.h>      int main()   {       int n, *stack1, *stack2, *stack, i, j, top = -1, flag, f;              while( scanf("%d", &n) != EOF )       {              stack1 = ( int * )malloc( sizeof( int ) * n );              stack2 = ( int * )malloc( sizeof( int ) * n );              stack  = ( int * )malloc( sizeof( int ) * n );                            for( i = 0; i < n; i++ )              {                   scanf("%d", &stack1[i]);              }                            for( i = 0; i < n; i++ )              {                   scanf("%d", &stack2[i]);              }                            top = -1;              i = 0;              j = 0;                         flag = 1;                            while( stack1[i] != stack2[j] )              {                     stack[++top] = stack1[i];                                          if( ( ++i ) >= n )                     {                         printf("No\n");                         flag = 0;                         break;                     }              }                            if( !flag )              {                  continue;              }                             i++;              j++;                            while( j < n )              {                     f = 0;                                          if( top > -1 )                     {                         if( stack2[j] == stack[top] )                         {                             top--;                             j++;                         }                         else                         {                             f = 1;                         }                     }                     else                     {                         f = 1;                     }                                          if( f )                     {                         while( stack2[j] != stack1[i] )                         {                                stack[++top] = stack1[i];                                i++;                                if( i >= n )                                {                                    printf("No\n");                                    flag = 0;                                    break;                                }                         }                         if( flag )                         {                             stack[++top] = stack1[i];                         }                     }                                          if( !flag )                     {                         break;                     }              }                            if( !flag )              {                  continue;              }                            printf("Yes\n");       }       return 0;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved