22题:栈的压入、弹出顺序
来源:互联网 发布:北京海量数据离职 编辑:程序博客网 时间:2024/06/01 22:57
题目描述
输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否是栈的弹出序列。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。‘
思路分析
首先考虑这个问题肯定是需要一个辅助栈,方便后边讲思路,我们将压入序列称为pushV,弹出序列称为popV,按照pushV将数据压入栈,压入一个数据就比较栈顶数据是否是popV中的第一个数,如果是,就将该栈顶数据pop掉,然后继续压入,并进行比较。
为了进行比较,我们需要一个辅助的vector来存放从栈内pop掉的数据,最后将这个vector和popV进行比较,如果顺序相同,说明popV是该栈的一个弹出序列,否则就不是。
下面画图分析下思路:(以上边的例子说明)
pushV:1、2、3、4、5
popV:4、5、3、2、1
现在以popV的序列为4、3、5、1、2分析:
综上分析过程:说明当栈不为空且栈顶数据和当前popV序列中的数据不相等时循环结束。
代码实现:
https://github.com/lybb/Offer/blob/master/offer_22.cpp
bool IsPopOrder(vector<int> pushV,vector<int> popV){ if (pushV.empty() || popV.empty()) return false; stack<int> s; vector<int> compV; //将s的出栈顺序保存在该vetcor中,最后和popV比较 vector<int>::iterator it1 = pushV.begin(); vector<int>::iterator it2 = popV.begin(); while (it1 != pushV.end()) { s.push(*it1); it1++; while(!s.empty() && s.top()==*it2) { compV.push_back(s.top()); s.pop(); it2++; } } if (!s.empty() && s.top()!=*it2)//如果栈s内有数据,但栈顶数据不是当前it2的数据,说明不是出栈顺序 return false; it2 = popV.begin(); vector<int>::iterator it = compV.begin(); while (it2!=popV.end() && it!=compV.end()) //比较comp和popV,如果有任意一个不同则表明popV不是出栈顺序 { if (*it2 != *it) return false; it2++; it++; } return true;}
阅读全文
0 0
- 22题:栈的压入、弹出顺序
- 栈的压入、弹出顺序
- 剑指offer:第22题栈的压入、弹出顺序
- 剑指offer:栈的压入弹出顺序
- [剑指offer][面试题22]栈的压入、弹出顺序
- 栈的压入、弹出序列和栈所有可能的弹出顺序
- 22栈的压入,弹出序列
- 22 栈的压入,弹出序列
- 22、栈的压入、弹出序列
- 已知栈的压入顺序,判断弹出顺序是否正确
- 【剑指offer】题22:栈的压入、弹出序列
- 栈的压入弹出
- 算法学习----给定入栈的顺序,判断另一个顺序是否为该入栈顺序的一个弹出顺序
- 栈的压入、栈的弹出
- 栈的压入、弹出序列(面试题 22)
- 面试题22:栈的压入、弹出队列
- 剑指oofer 22- 栈的压入、弹出序列
- 面试题22:栈的压入弹出序列
- 不能用 ngOnChanges 侦测query结果集的变化, 要用 observable subscribe
- 初探ansible
- 使用font-size:0 来去掉inline-block元素之间的空隙
- 关于sitemesh装饰器的使用方式
- [leetcode]78. Subsets(Java)
- 22题:栈的压入、弹出顺序
- windows10IoT+树莓派官方摄像头(Pi Camara) == 暂时无解
- Java String 提取 http 网址
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- 【Linux】子进程的异步等待方式
- ajax beforeSend complete 方法
- VUE开发环境的搭建
- centos启动tomcat后局域网无法访问,发现8080端口被tcp6占用解决方法
- 存储过程中带游标