栈的合法输出序列
来源:互联网 发布:搜狗五笔for mac下载 编辑:程序博客网 时间:2024/05/16 15:33
栈的合法输出序列
最近写栈的实验题,附加题中涉及合法输出序列。
<1>假设栈的输入序列为1、2、3、…、n,设计算法实现对给定的一个序列,判定其是否是此栈合法的输出序列。
<2>假设栈的输入序列为1、2、3、…、n,设计算法求出所有可能的出栈序列。
第一问在网上可以找到规律——判断出栈序列是否合法
它的规律在于出栈序列中,元素i之后所有比i小的元素间必须是降序排列的,元素i从头向后遍历。
因此在判断是,需要引入两个循环和一个变量表示最小值,然后依次进行比较。
bool StackArray::JudgeMatchedStackArray(int a[],int len){ int low=0;//表示一遍遍历中的最小值 for(int i=0;i<len;++i)//元素i从头向后依次遍历 { low=a[i]; for(int j=i;j<len;++j)//从元素i开始向后遍历,验证规律 { if(a[j]<a[i])//首先要找之后比元素i小的元素 { if(a[j]>low) return false; else //验证这些元素按照降序排列 low = a[j]; } } } return true;}
第二问较为复杂,基本思路是用递归解决。
这里贴两个提供思路的网址:
一、
(1)
我们之前谈到,合法的出栈序列条件: 对于每个已出栈数之后的且小于此数的数都必须按降序排列。例如1 2 5 3 4。对于5来说,后面的3,4都小于5,可是3,4却是升序的。则肯定不是合法的出栈序列。
由此可以想到我们可以求出所有的全排列,然后从中剔除掉非法序列。显然,当序列的长度增加时,多余的计算太多,效率太低。
(2)
模拟入栈出栈过程,每次都有两种选择,要么入栈要么出栈。显然按照递归方式是可行的。但是又有一个问题,一般递归,很少牵扯到递归层次之间数据传送问题。而模拟这个过程时,栈的信息从上层传到下层,最后回到上层时,必然栈的状态早已被下层改了。解决办法就是,下层返回时,回复栈的原状态。这样递归就不会出错了。
——求所有的出栈序列
伪代码来源
dostack(输入队列,中间栈,输出队列) if(输入队列为空) { if(中间栈为空) { 输出输出队列中的结果 } else { 中间栈出栈,放入输出队列 dostack(输入队列,中间栈,输出队列) }}else { if(中间栈非空) { 新建输入队列2、中间栈2、输出队列2 //这种情况下有两个出栈方式, //因此需要保存一下原状态,再分别对两个进行处理 中间栈2出栈并放入输出队列2 dostack(输入队列2,中间栈2,输出队列2) } 输入队列出队一个数并压入中间栈 dostack(输入队列,中间栈,输出队列) }
代码块
void StackArray::PopOrderStackArray(StackArray other,QueueArray another)//该类为输入栈,other 表示中间栈,another 表示输出队列{ if(EmptyStackArray()) { if(other.EmptyStackArray()) another.printQueueArray(); else { another.insertQueueArray(other.PopStackArray()); PopOrderStackArray(other,another); } } else { if(!other.EmptyStackArray()) { StackArray a(*this),b(other); QueueArray c(another); c.insertQueueArray(b.PopStackArray()); a.PopOrderStackArray(b,c); } other.PushStackArray(PopStackArray()); PopOrderStackArray(other,another); } return ;}
运行结果如下:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
阅读全文
0 0
- 栈的合法输出序列
- 栈的合法输出序列的数学证明
- 卡特兰数(Catalan)应用:输出所有N对合法括号序列和输出所有已知进栈序列的合法出栈序列
- 剑指offer-合法的出栈序列
- 合法的括号序列
- 已知压栈序列,判断合法的弹出序列
- 判断一个序列是否是栈的合法序列
- 判断一个栈的弹出序列是否为合法序列
- 【递归】输出给定的n对括号对的所有合法序列
- 判断合法出栈序列
- 合法出栈序列算法
- 判断是否是合法的出栈序列
- 合法序列
- 括号序列的最长合法子段
- 输出所有的合法的括号组合
- 判断序列是否为合法出栈
- 栈+括号配对 51Nod1478 括号序列的最长合法子段
- (hdu step 4.3.3)Sum It Up(从n个数中选出m个数让他们的和达到指定和targetSum,输出所有的合法序列)
- WebRTC-IP相关概念
- Oracle监听和TNS区别
- 随心love博客第一天
- 黑苹果安装总结
- 进程间通信方式2
- 栈的合法输出序列
- 异步回调发送请求
- 小程序2017.11.29笔记
- java 观察者模式
- 使用Spring AOP结合自定义Java注解实现动态数据源设置
- 入门到放弃node系列之微信公众号开发实战一(Express篇)
- Target Sum
- vuex新手教程(完整版整理)
- Oracle 设置表空间自增长