目录
一:题目
描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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
解题思路:
我们创建一个额外的栈,判断进栈的元素是否和出栈的元素相等,如果相等就出栈,如果不相等就进栈。
最后如果还留有元素,那么就returnFALSE,其余就return TRUE。
代码:
class Solution {
stack<int> st;//创建一个额外的栈
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
int n=pushV.size();
int j=0;
for(int i=0;i<n;i++)//从0开始遍历popV
{
while(j<n&&(st.empty()||st.top()!=popV[i]))//从0开始遍历pushV
{
st.push(pushV[j]);
j++;
}
if(st.top()==popV[i])
{
st.pop();
}
else
{
return false;
}
}
return true;
}
};
图解:
我们就拿例题来举例吧
(1)pushV的前三个数1 2 3,和popV的第一个数4都不相等,全部入栈
(2)当pushV的4进入后,pushV的4=popV的4,然后就出栈
(3)后面就相似,pushV的5进栈,然后5=5又出栈
(4)然后pushV就到末尾了,就一个一个出栈看我们自创栈能否出完,出完就TRUE,不能就FALSE
(5)栈空,TRUE