29. 栈的push,pop序列
题目:给定2个整数序列,其中1个是栈的push顺序,判断另一个有没有可能是对应的pop顺序
解:其实这题主要是判断进栈次数和出栈次数誓不是相等。我是用栈作的,效率不高,每一个元素最多出栈1次,进栈1此,所以最多进行2n次操作,然后每次对栈顶元素和pb指针指向的元素进行比较(因为假设序列中整数都不相等)
代码:
/* 判断栈push和pop顺序是否符合 push中的元素顺序入栈,如果等于pb指向的元素,那么循环出栈,知道栈空或者pb元素和栈顶元素不一样,如果一样,出栈且pb++,总共的入栈出栈次数最多是2*n次 */ #include<iostream> using namespace std; #define MAX 50 typedef struct { int data[MAX]; int top; }Stack; Stack* create_stack(void) { Stack* s=new Stack; if(s) s->top=-1; return s; } bool empty_stack(Stack* s) { if(-1==s->top) return true; return false; } bool full_stack(Stack* s) { if(MAX-1==s->top) return true; return false; } void push_stack(Stack* s,int value) { if(full_stack(s)) return ; s->top++; s->data[s->top]=value; } int pop_stack(Stack* s) { if(empty_stack(s)) return -1; int temp=s->data[s->top]; s->top--; return temp; } int get_stack(Stack* s) { if(empty_stack(s)) return -1; return s->data[s->top]; } void free_stack(Stack* s) { if(s) { delete s; s=NULL; } } bool satisfy(int *a,int *b,int n) { int i=0; int pa,pb; Stack* s; pa=0; pb=0; s=create_stack(); while(i++<2*n) { if(pa==n && pb==n) break; if(pa<n) { push_stack(s,a[pa]); pa++; } while(!empty_stack(s) && get_stack(s)==b[pb]) { pop_stack(s); pb++; } } bool flag; if(empty_stack(s) && pb==n) flag=true; else flag=false; free_stack(s); return flag; } int main(void) { int a[MAX]; int b[MAX]; int n,i; cin>>n; for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<n;i++) cin>>b[i]; cout<<boolalpha; cout<<satisfy(a,b,n)<<endl; return 0; }