栈的压入、弹出序列
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
解题思路
首先需要一个辅助栈来存储输入栈中遍历过的元素
1、将输入栈中的元素压入辅助栈,直到与输出栈中的元素相同(包含与输出栈相同的元素)
输出栈中第一个元素是4,将输入栈中的元素1,2,3,4压入辅助栈,此时辅助栈的栈顶元素 与输出栈的第一个元素相同,停止压栈
2、删除辅助栈的栈顶元素(与输出栈中相同的那个元素)
3、遍历到输出栈的下一个元素,若此时辅助栈的栈顶元素与之相同,则进行出栈操作;若此时辅助栈的栈顶元素与之不相同,则继续遍历输出栈,并将遍历到的元素压入辅助栈
4、当遍历完输入栈还没有找到与输出栈相同的元素,则表示输出栈中的序列不是输入栈的弹出序列;若辅助栈为空,则表示输出栈中的序列式输入栈的弹出序列
代码实现
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV)
{
//题目中已经说明输入栈与输出栈的长度相等,则只判断pushV.size() == 0 也可以
if(pushV.size() == 0 || popV.size() == 0 || pushV.size() != popV.size())
{
return false;
}
stack<int> m_data;
for(int i = 0, j = 0; i < pushV.size(); i++)
{
m_data.push(pushV[i]);
while(j < popV.size() && m_data.top() == popV[j])
{
m_data.pop();
j++;
}
}
return m_data.empty();
}
};