1. 程式人生 > >出棧序列(棧和隊列)

出棧序列(棧和隊列)

pos 字符串 小寫 flag stdio.h 一個數 esc 入棧 str

Description
已知自然數1,2,...,N(1≤N≤10000)依次入棧(即a<b當且僅當a先於b入棧),問:序列C1,C2,...,CN是否為可能的出棧序列。
  例如:N=5時,3,4,2,1,5是一個可能的出棧序列,因為其可以按如下操作獲得:push 1,push 2,push 3,pop,push 4,pop,pop,pop,push 5,pop

Input
 輸入數據包含若幹組測試樣例。
  每組測試樣例的第一行為整數N(1≤N≤10000);
  第二行為N個正整數,以空格隔開,為出棧序列;
  輸入數據的末尾以一個0表示輸入的結束。

Output
對於每組測試樣例,輸出結果為一行字符串。
  如給出的序列是可能的出棧序列,則輸出"Yes",否則輸出"No"。
  註意:區分大小寫,引號本身不輸出。

Sample Input
5
3 4 2 1 5
5
3 5 1 4 2
0
Sample Output
Yes
No
Hint

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<stack>
 4 using namespace std;
 5 int main()
 6 {
 7     int n,a[10000],i,j,flag;
 8     while(scanf("%d",&n)!=EOF)
 9     {
10         if(n==0)
11             break;
12         stack<int
>s; 13 flag=1; 14 for(i=0; i<n; i++) 15 { 16 scanf("%d",&a[i]); 17 } 18 for(i=1; i<a[0]; i++) 19 { 20 s.push(i); 21 }///搞定第一個數 22 for(j=1; j<n; j++) 23 { 24 if(a[j]>a[j-1])///後面的數大於前面的數
25 { 26 for(i=a[j-1]; i<=a[j]; i++) 27 { 28 s.push(i); 29 s.pop(); 30 } 31 } 32 else 33 { 34 35 if(s.top()==a[j]) 36 { 37 s.pop(); 38 } 39 else 40 { 41 flag=0; 42 break; 43 } 44 } 45 } 46 if(flag==1) 47 printf("Yes\n"); 48 else 49 printf("No\n"); 50 } 51 return 0; 52 }

出棧序列(棧和隊列)