栈的压入、弹出序列
描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
- 0<=pushV.length == popV.length <=1000
- -1000<=pushV[i]<=1000
- pushV 的所有数字均不相同
示例
输入:[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
解决方法00
- 基本思路
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z5T8Zq2N-1686651107606)(D:\Markdown\栈.jpg)] - 代码实现
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
stack<int> t;
int j = 0;
for(int i = 0;i < popV.size();i ++)
{
while(j < pushV.size() && (t.empty() || t.top() != popV[i]))
{
t.push(pushV[j]);
j ++;
}
if(t.top() == popV[i])
{
t.pop();
}
else return false;
}
return true;
}
};
解决方法01
- 基本思路
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kaksO3dJ-1686651107606)(D:\Markdown\栈1.jpg)] - 代码实现
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
int x = 0;//辅助栈
int i = 0;//遍历出栈
for(int n : pushV)
{
pushV[x] = n;
while(x >= 0 && pushV[x] == popV[i])
{
x --;
i ++;
}
x ++;
}
return x == 0;
}
};
}
x ++;
}
return x == 0;
}
};