题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
输入:[1,2,3,4,5],[4,5,3,2,1] 返回true
输入:[1,2,3,4,5],[4,3,5,1,2] 返回false
解题思路如下:
创建一个栈用来保存入栈序列,再创建一个下标i来表示对比序列数字下标。刚开始先入栈,然后将这个入栈的数字和对比序列的第一个数字比较,之后有两种结果:
1:如果不相同,则继续入栈。
2:如果相同:则pop栈顶元素并把i++,注意,在这之后需要继续比较因为有可能会连着好几个数字都相同。
最后就是看返回值,如果全部都能匹配玩这说明出栈序列正确,而且这时候栈被pop完了栈顶为空
如果不能全部匹配,那么栈没有被pop完,出栈序列是错滴。
代码如下
bool IsPopOrder(vector<int> pushV, vector<int> popV)
{
stack<int> st;
int i = 0;
for (auto pushVal : pushV)
{
st.push(pushVal);//每次雷打不动,先入一个数据
//出栈序列匹配后要持续比较,可能会有多个匹配
while (!st.empty()&&popV[i] == st.top())
{
++i;//相等,++popi
st.pop();
}
}
return st.empty();
}
给定两个整数序列,一个表示栈的压入顺序,任务是判断第二个序列是否可能是对应的弹出顺序。通过创建栈模拟入栈过程,与弹出序列对比,若能完全匹配且栈为空,则返回true,否则false。
1081





