剑指offer(C++)-JZ31:栈的压入弹出序列(数据结构-队列 & 栈)
Posted 翟天保Steven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer(C++)-JZ31:栈的压入弹出序列(数据结构-队列 & 栈)相关的知识,希望对你有一定的参考价值。
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
1. 0<=pushV.length == popV.length <=1000
2. -1000<=pushV[i]<=1000
3. pushV 的所有数字均不相同
示例1:
输入:
[1,2,3,4,5],[4,5,3,2,1]
返回值:
true
说明:
可以通过push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop() 这样的顺序得到[4,5,3,2,1]这个序列,返回true
示例2:
输入:
[1,2,3,4,5],[4,3,5,1,2]
返回值:
false
说明:
由于是[1,2,3,4,5]的压入顺序,[4,3,5,1,2]的弹出顺序,要求4,3,5必须在1,2前压入,且1,2不能弹出,但是这样压入的顺序,1又不能在2之前弹出,所以无法形成的,返回false
解题思路:
本题考察数据结构队列 & 栈的使用。
栈特性:先进后出。
1.尺寸判断,如果popV的尺寸大,那怎么都不可能复现弹出顺序。
2.定义一个辅助栈。
3.模拟入栈操作,当栈为空或者栈顶和popV的数值不一致时,就往里面放pushV的数据,直到栈顶一致。
4.模拟出栈操作,将栈顶与popV数值一致的数据弹出,进行下次循环;反之,返回false。
5.i表示弹出的次数,j表示入栈的数组尺寸。
测试代码:
class Solution
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV)
// 尺寸判断
int pushsize = int(pushV.size());
int popsize = int(popV.size());
if(popsize > pushsize)
return false;
// 辅助栈
stack<int> s;
// 入栈下标
int j = 0;
for(int i = 0; i < popV.size() ; ++i)
// 入栈:栈为空或者栈顶不等于出栈数组
while(j < pushsize && (s.empty() || s.top() != popV[i]))
s.push(pushV[j]);
j++;
// 栈顶等于出栈数组
if(s.top() == popV[i])
s.pop();
// 不匹配
else
return false;
return true;
;
人生大事真好看!强烈推荐!
好片不怕糊,这么冷的市场居然16亿了,真不错。
“天上的每颗星星,都是爱过我们的人呀!”
以上是关于剑指offer(C++)-JZ31:栈的压入弹出序列(数据结构-队列 & 栈)的主要内容,如果未能解决你的问题,请参考以下文章