前言:
- 发现每一题都更新实在太浪费时间,从现在开始只更新自己不会的或者比较麻烦的。
- 本人所有代码均由C++语言完成完成
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路:
借用一个辅助的栈,遍历压栈顺序,先将第一个放入栈中,例子中是1,然后判断是不是出栈顺序的第一个元素,例子中为4,显然不相同,所以继续压栈,直到相等以后出栈,出栈一个元素,则将出栈顺序向后移动一位,知道不相等,如果辅助栈不为空,说明不是弹出顺序。
步骤 | 操作 | 栈 | 弹出数字 |
---|---|---|---|
1 | 压入1 | 1 | |
2 | 压入2 | 1,2 | |
3 | 压入3 | 1,2,3 | |
4 | 压入4 | 1,2,3,4 | |
5 | 弹出 | 1,2,3 | 4 |
6 | 压入5 | 1,2,3,5 | |
7 | 弹出 | 1,2,3 | 5 |
8 | 弹出 | 1,2 | 3 |
9 | 弹出 | 1 | 2 |
10 | 弹出 | empty | 1 |
步骤 | 操作 | 栈 | 弹出数字 |
---|---|---|---|
1 | 压入1 | 1 | |
2 | 压入2 | 1,2 | |
3 | 压入3 | 1,2,3 | |
4 | 压入4 | 1,2,3,4 | |
5 | 弹出 | 1,2,3 | 4 |
6 | 弹出 | 1,2 | 3 |
7 | 压入5 | 1,2,5 | |
8 | 弹出 | 1,2 | 5 |
9 | 此时应该弹出1,但是栈顶元素为2,操作终止。false |
代码段:
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size()==0)
return false;
int i=0; //压入个数
int j=0; //弹出顺序
for(;i<pushV.size();i++){
//压入栈
Data.push(pushV[i]);
//若弹出序列的第j个等于栈顶
while(j<popV.size() && popV[j]==Data.top()){
Data.pop();
j++;//弹出下一个
}
}
if(Data.empty())
return true;
else
return false;
}
private:
stack<int> Data; //辅助栈
};