题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
假设压入栈的所有数字均不相等。
例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。
注意:若两个序列长度不等则视为并不是一个栈的压入、弹出序列。若两个序列都为空,则视为是一个栈的压入、弹出序列。
数据范围
序列长度 [0,1000]。
样例
输入:[1,2,3,4,5] [4,5,3,2,1] 输出:true
方法一:栈 O(n)
这道题我们直接用栈来模拟,最后判断栈是不是空即可。
我们拿题目的样例举例,看看具体是如何实现的:
第一步: 往 s
中推入第一个元素 1
,发现与 popV
的第一个元素不等,不执行弹出操作。
第二步~第四步: 重复第一步操作,直至第四步发现推入的元素 4
与 popV
的第一个元素相等,则 popV
的 index
指针向后移动。
第五步: 推入最后一个元素,发现与 popV
的 index
指向的元素相等,则执行弹出操作,index
后移,并重复该操作。结果后续栈顶元素都与 index
指向的元素相等,一直弹出。
第六步:发现最后栈 s
为空,返回 true
即可。
class Solution { public: bool isPopOrder(vector<int> pushV, vector<int> popV) { if (pushV.size() != popV.size()) return false; stack<int> s; int index = 0; for (int i = 0; i < pushV.size(); i++) { s.push(pushV[i]); while (!s.empty() && popV[index] == s.top()) { index++; s.pop(); } } if (s.empty()) return true; return false; } };
欢迎大家在评论区交流~