题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
假设压入栈的所有数字均不相等。
例如序列 $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
思路
用两个指针代表遍历到压入顺序的第$i$个和弹出序列的第$j$个,对于压入序列的每一个数,每次先把它压入栈。如果栈的顶端等于弹出序列中的$j$,就把栈顶弹出,j++
;否则,把压入序列的第$i+1$个数压入栈。
压入数列遍历完后,如果栈为空,则说明能行,否则说明不行。
代码
class Solution {
public:
bool isPopOrder(vector<int> pushV,vector<int> popV) {
if (pushV.size() != popV.size())
return false;
stack <int> s;
//用auto ……:…… 遍历压入序列的每个数
for (auto x : pushV)
{
s.push(x);
//如果栈不是空的并且栈的顶端等于弹出序列的第i个
while (!s.empty() && s.top() == popV[i])
{
s.pop();
i ++;
}
}
//返回s是否为空
return s.empty();
}
};
好了,这篇题解到这里就结束了。感谢观看!
ヽ( ̄ω ̄〃)ゝ
$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\mathcal{writer\enspace by \enspace acwing}$ : $\mathfrak{天元之弈}$