力扣对应题目链接:946. 验证栈序列 - 力扣(LeetCode)
牛客对应题目链接:栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com)
核心考点 :栈的理解。
一、《剑指Offer》内容
二、分析题目
要判定第二个序列是否可能是该栈的弹出序列,就要使用指定的入栈顺序模拟出来对应的弹栈序列,我们设入栈顺序序列式 pushV,可能出栈序列 popV。popv 的第一个元素,一定是最后入栈,最先弹栈的, 而我们的入栈顺序是一定的,也就决定了,我们必须一直入栈,直到碰到 popv 的第一个元素,然后开始弹栈。最后在循环这个过程,如果符合要求,最后栈结构一定是空的。
- 遍历入栈序列,只要 popv 的第一个数据和当前 pushv 的数据不相等,一直进行入栈操作。
- 只要 st 栈顶值和 popv 的出栈序列数据是相等的,则一直执行出战逻辑
- 返回 st.empty()
三、代码
//牛客
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pushV int整型vector
* @param popV int整型vector
* @return bool布尔型
*/
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
if(pushV.empty() || popV.empty() || pushV.size()!=popV.size())
return false;
stack<int> st;
int j=0;
for(int i=0; i<pushV.size(); i++)
{
st.push(pushV[i]);
while(!st.empty() && st.top()==popV[j])
{
st.pop();
j++;
}
}
if(st.empty()) return true;
else return false;
}
};
//力扣
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
if(pushed.empty() || popped.empty() || pushed.size()!=popped.size())
return false;
stack<int> st;
int j=0;
for(int i=0; i<pushed.size(); i++)
{
st.push(pushed[i]);
while(!st.empty() && st.top()==popped[j])
{
st.pop();
j++;
}
}
return st.empty();
}
};