数据结构实验之栈七:出栈序列判定
生活随笔
收集整理的這篇文章主要介紹了
数据结构实验之栈七:出栈序列判定
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
給一個初始的入棧序列,其次序即為元素的入棧次序,棧頂元素可以隨時出棧,每個元素只能入棧依次。輸入一個入棧序列,后面依次輸入多個序列,請判斷這些序列是否為所給入棧序列合法的出棧序列。
例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個出棧序列,但4,3,5,1,2就不可能是該序列的出棧序列。假設壓入棧的所有數字均不相等。
輸入
?第一行輸入整數n(1<=n<=10000),表示序列的長度。第二行輸入n個整數,表示棧的壓入順序。
第三行輸入整數t(1<=t<=10)。
后面依次輸入t行,每行n個整數,表示要判斷的每一個出棧序列。
輸出
?對應每個測試案例輸出一行,如果由初始入棧序列可以得到該出棧序列,則輸出yes,否則輸出no。示例輸入
51 2 3 4 524 5 3 2 14 3 5 1 2示例輸出
yesno #include<stdio.h> #include<stdlib.h> #include<malloc.h> #define STACKSIZE 10000 typedef int element; typedef struct {element *base;element *top;element stacksize; }stack; void initialstack(stack &s)//棧的初始化; {s.base=(element *)malloc(STACKSIZE*sizeof(element));if(!s.base) exit(0);s.top=s.base;s.stacksize=STACKSIZE; } void gettop(stack &s,element &e)//獲得棧頂元素; {if(s.top!=s.base)e=*(s.top--); } void push(stack &s,int e)//進棧; {if(s.top-s.base>=s.stacksize){s.base=(element *)realloc(s.base,2*STACKSIZE*sizeof(element));if(!s.base) exit(0);s.top=s.base+s.stacksize;s.stacksize+=STACKSIZE;}*s.top=e;s.top++; } void pop(stack &s,element &e)//出棧; {if(s.top!=s.base){s.top--;e=*s.top;} } element stackempty(stack &s)//判斷是否為空棧; {return s.top==s.base?1:0; } void clean(stack &s)//棧的清空; {s.top=s.base; } element p[10001],q[10001]; element main() {stack s;//棧的定義;initialstack(s);//棧的初始化;element n;scanf("%d",&n);for(element i=0;i<n;i++)scanf("%d",&p[i]);int m;scanf("%d",&m);while(m--){clean(s);//清空棧;for(element i=0;i<n;i++)scanf("%d",&q[i]);element a=0,b=0;while(a<n){if(p[a]==q[b])//出棧序號對應相等則比較下一序號;{a++;b++;}else{push(s,p[a]);a++;}}element flag=1;//判斷出棧是否滿足出棧規則的標記;while(!stackempty(s)){element e;pop(s,e);if(e==q[b])//如果序號相等則繼續比較{b++;}else//否則不符合出棧規則結束;{flag=0;break;}}if(flag)printf("yes\n");elseprintf("no\n");} }總結
以上是生活随笔為你收集整理的数据结构实验之栈七:出栈序列判定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构实验之查找二:平衡二叉树
- 下一篇: 双向队列