【100题】第二十九 栈的push、pop序列

栈序列判定算法
本文介绍了一个算法,用于判断给定的两个整数序列是否可能分别对应栈的压入和弹出顺序。通过模拟压栈和弹出的过程,验证了序列的有效性。

一,题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。

如果我们希望pop的数字正好是栈顶数字,直接pop出栈即可;
如果希望pop的数字目前不在栈顶,我们就到push序列中还没有被push到栈里的数字中去搜索这个数字,并把在它之前的所有数字都push进栈。
如果所有的数字都被push进栈仍然没有找到这个数字,表明该序列不可能是一个pop序列。

其实这是一个计算机考研时经常遇到的一道选择题,题目给定一个压栈序列,然后找出选项中哪一个一定不是可能的出栈序列。
二,分析

例如输入顺序为1 2 3 4 5不可能输出顺序为: <1 4 23 5> <4 2 3 5 1 > <1 5 2 3 4 > <3 4 1 2 5>……

可能输出顺序为: <1 2 3 4 5 ><5 4 3 2 1 ><2 1 3 4 5> <3 2 1 5 4 >……

如何判定输出顺序<1 4 2 3 5 >为不可能顺序?

新建一个栈m_stack push[]={1 2 3 4 5} pop[]={1 4 2 3 5}

第一轮 m_stack.push(push[0]); pop[0]=m_stack.top--->m_stack.pop;

第二轮 m_stack.push(push[1]); pop[1]!=m_stack.top--->m_stack.push[2] m_stack.push[3] ----pop[1]=m_stack.top--->m_stack.pop

第三轮 m_stack.push[4]; pop[2]!=m_stack.top ---->push 中没有全部pop出来 所以不是正确的输出序列

三,源码

#include<iostream> #include<stack> const int SIZE=5; //定义长度 using namespace std; bool judge(int Spush[],int Spop[]) { stack<int> my_stack; int iPush=0,iPop=0; while(iPush<SIZE) { cout<<"push "<<Spush[iPush]<<endl; //当栈顶和pop相等时,将pop后的栈顶与pop之后的元素相比,直到不等 my_stack.push(Spush[iPush]); //测试 while(!my_stack.empty()&&iPop!=5&&my_stack.top()==Spop[iPop]) //小心数组越界 { cout<<"pop "<<Spop[iPop]<<endl; iPop++; my_stack.pop(); } iPush++; } if(iPop==SIZE) return true; else return false; } int main(void) { int Spush[SIZE]={1,2,3,4,5}; int Spop[SIZE]={1,2,3,4,5}; if(judge(Spush,Spop)) cout<<"Yes"<<endl; else cout<<"No"<<endl; system("pause"); return 0; }
7. (单选) 若有一个的输入序列是(1,2,3,…,n),输出序列的第一个元素是n,则第i个输出的元素是( )。 A n-I B n-i-1 C n-i+1 D 不确定 8. (单选) 若5个元素的出序列为(1,2,3,4,5),则进序列可能是( )。 A 2,4,3,1,5 B 2,3,1,5,4 C 3,1,4,2,5 D 3,1,2,5,4 9. (单选) 若有三个字符的字符串序列执行入操作,则其所有可能的输出序列共有( )几种情况。 A 3种 B 4种 C 5种 D 6种 10. (单选) 假定一个链顶指针用top表示,该链为空的条件为( )。 A top!=NULL B top=top->next C top==NULL D top!=top->next 11. (单选) 假定一个链L的顶指针用top表示,当p指向的结点进时,执行的操作为( )。 A p->next=top;top=top->next; B top=p;p->next=top; C p->next=top->next;top->next=p ; D p->next=top; L->next=p; 12. (单选) 假定一个链顶指针用top表示,退时所进行的指针操作为( )。 A top->next=top B top=top->data C top=top->next D top->next=top->next->next 13. (单选) 从顶指针为top的链中删除一个结点,用x保存被删除结点的值,则执行( )。 A x=top; top=top->next; B x=top->data; C top=top->next; x=top->data; D x=top->data; top=top->next; 14. (单选) 对于操作数据的原则是( )。【青岛大学 2001 五、2(2分)】 A 先进先出 B 后进先出 C 后进后出 D 不分顺序 15. (单选) 一个的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是( )。 【中山大学 1999 一、9(1分)】 A 不确定 B n-i+1 C i D n-i 16. (单选) 若已知一个的入序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pN ,若pN 是 n,则pi是( )。 【南京理工大学 2001 一、1(1.5分)】 A i B n-i C n-i+1 D 不确定 17. (单选) 有六个元素6,5,4,3,2,1 的顺序进,问下列哪一个不是合法的出序列?( ) A 5 4 3 6 1 2 B 4 5 3 1 2 6 C 3 4 6 5 2 1 D 2 3 4 1 5 6 18. (单选) 一个的输入序列为1 2 3 4 5,则下列序列中不可能是的输出序列的是( )。 【南开大学 2000 一、1】【山东大学 2001 二、4 (1分)】【北京理工大学 2000 一、2(2分)】 A 2 3 4 1 5 B 5 4 1 3 2 C 2 3 1 4 5 D 1 5 4 3 2 19. (单选) 设一个的输入序列是 1,2,3,4,5,则下列序列中,是的合法输出序列的是( )。 【合肥工业大学 2001 一、1(2分)】 A 5 1 2 3 4 B 4 5 1 3 2 C 4 3 1 2 5 D 3 2 1 5 4 20. (单选) 某堆的输入序列为a, b,c ,d,下面的四个序列中,不可能是它的输出序列的是( )。 【北京航空航天大学 2000 一、3(2分)】【北京邮电大学 1999 一、3(2分)】 A a,c,b,d B b, c,d,a C c, d,b, a D d, c,a,b 21. (单选) 设abcdef以所给的次序进,若在进操作时,允许退操作,则下面得不到的序列为( )。 【南京理工大学 1996 一、9(2分)】 A fedcba B bcafed C dcefba D cabdef 22. (单选) 依次读入数据元素序列{a,b,c,d,e,f,g}进,每进一个元素,机器可要求下一个元素进或弹,如此进行,则空时弹出的元素构成的序列是以下哪些序列?【哈尔滨工业大学 2000 七(8分)】 A {d ,e,c,f,b,g,a} B {f,e,g,d,a,c,b} C {e,f,d,g,b,c,a} D {c,d,b,e,f,a,g} 23. (单选) 设有三个元素X,Y,Z顺序进(进的过程中允许出),下列得不到的出排列是( )。 【南京理工大学 1997 一、5(2分)】 A XYZ B YZX C ZXY D ZYX 24. (单选) 输入序列为ABC,可以变为CBA时,经过的操作为( )【中山大学 1999 一、8(1分)】 A push,pop,push,pop,push,pop B push,push,push,pop,pop,pop C push,push,pop,pop,push,pop D push,pop,push,push,pop,pop 25. (单选) 若采用顺序存储方式存储,现两共享空间V[1..m],top[i]代表第i个( i =1,2)顶,1的底在v[1],2的底在V[m],则满的条件是( )。 【南京理工大学 1999 一、14(1分)】 A |top[2]-top[1]|=0 B top[1]+1=top[2] C top[1]+top[2]=m D top[1]=top[2] 26. (单选) 在( )中应用。【中山大学 1998 二、3(2分)】 A 递归调用 B 子程序调用 C 表达式求值 D A,B,C 27. (单选) 一个递归算法必须包括( )。【武汉大学 2000 二、2】 A 递归部分 B 终止条件递归部分 C 迭代部分 D 终止条件迭代部分 28. (单选) 递归过程或函数调用时,处理参数及返回地址,要用一种称为( )的数据结构。 【福州大学 1998 一、1(2分)】 A 队列 B 多维数组 C D 线性表 29. (单选) 算术表达式a+b*(c+d/e)转为后缀表达式后为( )【中山大学 1999 一、5】 A ab+cde/* B abcde/+*+ C abcde/*++ D abcde*/++
最新发布
10-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值