需要更好的阅读的体验请移步 👉 小牛肉的个人博客 👈
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
解题思路
新建一个栈 v,按照入栈的顺序重新入栈一次,但是在入栈的时候,要结合出栈的顺序来判断是否应该出栈。即这个栈是用来模拟整个序列的压栈弹栈过程。
建设压栈序列 1 2 3 4 5,弹出序列 4 5 3 2 1
- 1 入栈 v,发现出栈的第一个元素为4,不等于1,因此就直接入栈,
- 2 入栈 v,出栈的第一个元素是4,不等于2,直接入栈
- 3 入栈 v,出栈的第一个元素是4,不等于3,直接入栈
- 4 入栈 v,出栈的第一个元素就是4,因此要执行一个pop操作,4入栈并弹出
- 5 入栈 v,现在需要出栈的元素就是5,因此要执行一个pop操作,5入栈并弹出
- v 中的序列现在所剩序列为 1 2 3,栈顶元素是3,现在要出栈的元素就是3, 因此要执行一个pop操作,3入栈并弹出
- v 中的序列现在所剩序列为 1 2 ,栈顶元素是2,现在要出栈的元素就是2, 因此要执行一个pop操作,2入栈并弹出
- v 中的序列现在所剩序列为 1 ,栈顶元素是1,现在要出栈的元素就是1, 因此要执行一个pop操作,1入栈并弹出
- v 空,该出栈序列正确!
具体代码
- C++
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
vector<int> v;
int len = pushV.size();
for(int i = 0,j = 0; i < len; i++){
v.push_back(pushV[i]);
while(j<len && v.back()==popV[j]){
v.pop_back();
j ++;
}
}
return v.empty();
}
};
- Java
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
int len = pushA.length;
Stack<Integer> s = new Stack<>();
for(int i = 0, j = 0; i < len; i++){
s.push(pushA[i]);
while(j<len && s.peek() == popA[j]){
s.pop();
j ++;
}
}
return s.empty();
}
}