JZ31 栈的压入、弹出序列 #栈# #模拟栈#
栈的压入、弹出序列
https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&tqId=23290&ru=/exam/oj/ta&qru=/ta/coding-interviews/question-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D13
解题思路:
- 我们不妨建立一个栈模拟弹栈的过程,如果能得到给定的弹栈序列,返回true;否则返回false;
- 每压入一个元素都要和弹出序列做比较,如果匹配成功就连续比较出栈,直到匹配失败:
- 如果pushV中的数据没压完,就压入新元素,再次匹配。
- 如果pushV中的数据压完了,但是栈中的数据没弹完(或是popV没匹配完),则说明无法得出给定的弹出序列。
题解:
class Solution {
public:
bool IsPopOrder(vector<int> pushV, vector<int> popV) {
stack<int> st;
size_t popi = 0;
for (auto e : pushV) {
st.push(e);
//出栈序列匹配后要连续比较,出栈;可能会有多个匹配
while (!st.empty() && st.top() == popV[popi]) {
st.pop();
++popi;
}
}
return popi == popV.size();
// return st.empty();
}
};

