一、题目
描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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 的所有数字均不相同
二、题解
本题需要了解栈的特性,栈的入栈出栈顺序不一定是全部入栈后再全部出栈,只要符合入栈出栈的规则即可。
本题思路在于模拟入栈出栈的过程,栈空时进行入栈,入栈的栈顶元素与出栈元素相同时出栈不同时进行入栈,因此本题遍历入栈序列时在栈不为空时每入栈一个元素进行一次判断,如果与出栈序列相同就出栈否则持续入栈,在此过程需要注意访问的范围的问题以及栈空的问题。
cpp
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
stack<int> st;
size_t n = pushV.size();
//st.push(pushV[0]);
size_t j = 0;
size_t i = 0;
while(i < n || j < n)
{
if(st.empty())
{
if(i >= n)
{
return false;
}
st.push(pushV[i]);
i++;
}
if(st.top() == popV[j])
{
st.pop();
j++;
}
else
{
if(i >= n)
{
return false;
}
st.push(pushV[i]);
i++;
}
}
return st.empty();
}
优化:每次都是先进行入栈直到相等需要出栈的时候,同时出栈时也需要注意栈为空的问题。出栈时可以连续的进行判断直到不需要出栈或者栈为空停止出栈。
cpp
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
stack<int> st;
size_t i = 0;
for(auto& e : pushV)
{
st.push(e);
while(!st.empty() && st.top() == popV[i])
{
st.pop();
i++;
}
}
return st.empty();
}