给定入栈序列判断给定出栈序列是否合法
来源:互联网 发布:电脑usb001端口是哪个 编辑:程序博客网 时间:2024/03/28 17:16
题目:输入两个整数序列。其中一个序列表示栈的入栈顺序,判断另一个序列有没有可能是对应的出栈顺序。
思路:用一个辅助栈,将入栈序列按照某种顺序入栈,看是否可以产生出栈序列即可。
1)如果当前栈为空,且入栈序列不空,则入栈序列的下一个元素入栈;
2)如果当前辅助栈的栈顶元素不等于出栈序列的首元素,那么入栈序列一直入栈,直到入栈序列为空。
3)如果当前辅助栈的栈顶元素等于出栈序列的首元素,那么栈顶元素弹出,出栈序列第一个元素移走;
4) 如果入栈序列为空,出栈序列第一个元素仍然不等于栈顶元素,则表示2个序列是不匹配的。
举例:
栈的特点是后进先出,假设入栈的顺序是 1 2 3 4 5,出栈的顺序是:4 5 3 2 1,这样操作的顺序是:push 1, push 2,push 3,push 4,pop 4, push 5 , pop 5,pop 3, pop 2, pop 1。假设出栈的顺序是4 5 3 1 2,这种顺序是错误的,因为1比2先压入栈,所以2的出栈顺序应该是1之前,显然出栈顺序是错误的。下面使用程序进行验证
代码如下:
#include <iostream>#include <stack>#include <cstring>using namespace std;//给定入栈序列判断出栈序列是否合法,stkIn表示入栈序列,stkOut表示出栈序列bool JudgeIsLegal(char *stkIn, char *stkOut){stack<char> midStk;//判断过程中借助的中间辅助栈if(strlen(stkIn) != strlen(stkOut)){//若入栈与出栈的元素个数不同的话,直接返回falsereturn false;}midStk.push(*stkIn++);//入栈序列的第一个元入栈while(*stkOut != '\0'){//如果出栈序列没有匹配完if(midStk.empty() && *stkIn!='\0')//若辅助栈已空说明目前出栈和入栈序列是匹配的,如果入栈序列不为空,继续入栈 midStk.push(*stkIn++);//如果辅助栈的栈顶元素和出栈序列第一个元素不一致,那么就将入栈序列继续入栈 while(*stkOut != midStk.top() && *stkIn != '\0'){midStk.push(*stkIn++);}//如果栈顶元素和出栈序列第一个元素一致,那么就将栈顶元素出栈,并且匹配出栈序列下一个元素 if(*stkOut == midStk.top()){stkOut++;midStk.pop();continue;}//如果入栈序列已为空,但是栈顶元素和出栈序列第一个元素扔不一致,则说明这2个串不是匹配的。 if(*stkIn == '\0' && midStk.top() != *stkOut){return false;}}return true;}int main(){char *str ="12345"; char *str2 = "45312"; if (JudgeIsLegal(str,str2)){cout<<"该出栈序列合法!"<<endl;}else{cout<<"该出栈序列非法!"<<endl;}return 0;}
1 0
- 给定入栈序列判断给定出栈序列是否合法
- 给定入栈序列,判断出栈序列是否合法
- 给定入栈序列判断给定出栈序列是否合法(Exercise1_3_45,java)
- 给定入栈序列,判定出栈序列是否合法
- 给定入栈序列,判断可能的出栈序列
- 给定入栈顺序,判断出栈顺序是否合法
- 给定入栈顺序,判断出栈顺序是否合法
- 判断给定序列是否是对应入栈序列的出栈序列(C++)
- 给出入栈序列,快速判断出栈序列是否合法
- 3.5判断出栈和入栈操作序列是否合法
- 判断出栈序列是否合法
- 判断出栈序列是否合法
- 判断出栈序列是否合法
- 判断出栈序列是否合法
- 给定入栈顺序,输出所有可能的出栈情况,并判断给定的序列是否为正确的输出序列
- 【100题】给定入栈序列,判断一个序列是否可能为输出序列
- 给定一个入栈序列,求所有可能的出栈序列
- 给定一个入栈序列,求所有可能的出栈序列
- zoj 1610 Count the Colors 【暴力】
- VMware中的Linux系统下的硬盘扩容:ubuntu 重新挂载/usr
- MySQL常用函数
- Android--Listview学习
- 3.0MongoDB使用的jar包
- 给定入栈序列判断给定出栈序列是否合法
- JLINK驱动刷新之WIN7
- hdoj 5124 lines【】
- java静态代码块、初始化块和构造方法的执行顺序
- 2817:木棒 【递归+剪枝】
- 【Oracle】无宕机迁移更换asm磁盘
- Java String之intern()方法深入分析
- exej4打包jar图文教程
- gradle eclipse web模板项目构建