✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:剑指offer系列题解
📝原题地址:题目地址
📣专栏定位:为找工作的小伙伴整理常考算法题解,祝大家都能成功上岸!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
假设压入栈的所有数字均不相等。
例如序列 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;
}
};
欢迎大家在评论区交流~