题目来源:牛客网
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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 的所有数字均不相同
代码:
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
stack<int> st;
int pushi = 0,popi=0;
while(pushi < pushV.size()){
st.push(pushV[pushi++]);
if(st.top() != popV[popi]){
//不匹配
continue;
}else{
//匹配
while(!st.empty() && st.top() == popV[popi]){
st.pop();
++popi;
}
}
}
return st.empty();
}
思路:
我们用示例1举例,入栈序列为1,2,3,4,5,出栈为4,5,3,2,1
我们先入数据,直到匹配为止,比如出栈序列的第一个元素为4,那我们就一直入,直到有4,然后就可以出了,我们出一个4
此时入栈序列和出栈序列都到5了,还是匹配,那就继续出,然后出栈序列指向了3,此时栈顶也是3,匹配,,也就是说,出栈是可能连续出的,继续出,2也匹配,1也匹配,然后栈是空的,两个列表都走完了,返回true,如果栈此时不为空,返回false,大家可以用示例2自己试一试
优化:
匹配后出数据有两种情况,一种是栈出空了,那就回去继续入,另一种就是没有出空,但是不匹配,那也一样继续入,所以代码是可以优化的
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
stack<int> st;
int pushi = 0,popi=0;
while(pushi < pushV.size()){
st.push(pushV[pushi++]);
//匹配
while(!st.empty() && st.top() == popV[popi]){
st.pop();
++popi;
}
}
return st.empty();
}
本质一样,只是我们之前的逻辑更清晰一点