(剑指Offer)面试题22:栈的压入、弹出序列
题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
思路:
直观的想法就是模拟第一个序列的数字依次入栈,并按照第二个序列依次弹出,如果第一个序列全部入栈,并最后栈中元素都被弹出来,就说明第二个序列是该栈的弹出顺序。
- 建立一个辅助栈;
- 将第一个序列的数字压入辅助栈;
- 如果第二个序列的下一个弹出数字刚好是栈顶数字,则直接弹出,第二个序列弹出当前数字,辅助栈也弹出该数字;
- 否则,就把第一个序列中尚未入栈的数字压入辅助栈,直到把第二个序列中下一个需要弹出的数字压入栈顶为止。
- 如果第一个序列的所有数字都已经入栈了,仍然没有找到下一个弹出的数字,那么第二个序列不可能是一个弹出序列。
代码:
#include <iostream>
#include <stack>using namespace std;bool IsPopOrder(const int* push,const int* pop,int length){bool bPossible=false;if(push!=NULL && pop!=NULL && length>0){std::stack<int> stackData;int i=0;int j=0;while(j<length){while(stackData.empty() || stackData.top()!=pop[j]){if(i>length-1)break;stackData.push(push[i]);++i;}if(stackData.top()!=pop[j])break;stackData.pop();++j;}if(stackData.empty() && j==length)bPossible=true;}return bPossible;
}int main()
{int A[]={1,2,3,4,5};int B[]={4,5,3,2,1};int length=sizeof(A)/sizeof(A[0]);cout << IsPopOrder(A,B,length) << endl;return 0;
}
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/d77d11405cc7470d82554cb392585106?rp=1
AC代码:
class Solution {
public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {int length=pushV.size();if(pushV.size()>0 && popV.size()>0 && pushV.size()==popV.size()){std::stack<int> stackData;int i=0;int j=0;while(j<length){while(stackData.empty() || stackData.top()!=popV[j]){if(i>length-1)break;stackData.push(pushV[i]);++i;}if(stackData.top()!=popV[j])break;stackData.pop();++j;}if(stackData.empty() && j==length)return true;}return false;}
};
转载于:https://www.cnblogs.com/AndyJee/p/4651281.html
(剑指Offer)面试题22:栈的压入、弹出序列相关推荐
- 【剑指offer-Java版】22栈的压入弹出序列
栈的压入弹出序列:给定两个序列,一个是压入顺序,判断另外一个是否是该压入顺序的一个弹出顺序 思路:纯粹的模拟栈的压入和弹出顺序 分别遍历压栈序列seq1和另一个序列seq2 比较当前栈顶元素和seq2 ...
- 剑指offer面试题[22]-栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...
- 剑指offer面试题31. 栈的压入、弹出序列(链表)
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2 ...
- 剑指offer(21)栈的压入、弹出序列
题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该 ...
- 剑指offer-21.栈的压入弹出序列
1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...
- 数据结构与算法--举例分析法- 栈的压入弹出序列
举例分析 与上两篇问中画图方法一样,我们可以用举例模拟的方法思考分析复杂问题.当一眼不能看出问题的规律的时候,我们可以用几个具体的例子来模拟一下问题的过程.这样就和我们在程序出现问题时候的debug一 ...
- 剑指offer(21)栈的压入、探出序列
链接:https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106 思路:借用一个辅助的栈,遍历压栈顺序,先将第 ...
- python 栈的压入弹出序列
| 栈的压入和弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序, 请判断第二个序列是否为该栈的弹出顺序. 假设压入栈的所有数字均不相等. 例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序 ...
- 剑指offer——面试题22:栈的压入、弹出序列
剑指offer--面试题22:栈的压入.弹出序列 Solution1: 要理解并背诵此题! 参考网址: https://www.cnblogs.com/AndyJee/p/4651281.html h ...
- 剑指offer——面试题41:和为S的连续整数序列
剑指offer--面试题41:和为S的连续整数序列 Solution1:我的答案 基本思路是根据等差数列的前n项和推导出首项与项数的关系,设首项为a1a1a_1,项数为kkk,和为S" ro ...
最新文章
- STM32F103固件库编程:关于core_cm3.c的错误
- Design verification经验总结
- python decorator ssh_Python库现后门 可窃取用户SSH信息
- android 6.0 logcat机制(三)logd处理请求log
- HBuilder、HBuilderX连接夜神模拟器
- 数据结构上机测试2-1:单链表操作A
- Ansible系列--Copy模块
- mysql的varchar与text对比
- 利用 Commons-Fileupload 实现文件上传分析(转)
- Lasso估计学习笔记(二)
- 完美的迅捷PDF在线转换软件
- android 界面 edittext详解,Android 开发之EditText属性详解
- 富士通Fujitsu DPK750 Pro 打印机驱动
- 服务器共享文件夹设置特殊权限,资料共享服务器权限设置、服务器共享盘设置权限、设置局域网共享文件夹访问权限的方法...
- 详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS
- 淘宝快捷回复短语大全
- dev c++缺省源
- 硬盘分区,格式化分区,删除分区
- 30分钟LINQ教程(转)
- MATLAB实战——方差分析