题目
(1)给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
(2)示例如下:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
解决思路
- 题意分析:题意即验证能否根据pushed的入栈顺序得到poped的出栈顺序,若能则返回true,若不能则返回false。
- 思路:
- 验证栈序列时只需关注出栈序列,出栈序列的每个元素应等于入栈序列的当前栈顶元素或未来要进入栈的元素。
- 如果当前出栈序列的元素不等于入栈序列的栈顶元素且也不等于未来某个要入栈的元素,则不能根据入栈序列顺序得到出栈序列,则返回false。
- 具体方法:
- 第一步:用 j 表示pushed的索引,初始化 j = 0,将pushed中的第 j 个元素pushed[j]转入栈s中。
- 第二步:用 i 表示poped的索引,初始化 i = 0,判断栈s的栈顶元素是否等于poped的当前元素poped[i]。如果不相等则将pushed的下一个元素pushed[++j]转移到站s中;如果相等,则将栈s的栈顶元素弹出。
- 重复上述两步,直到结束。
代码
- C++代码
# include <stdio.h>
# include <vector>
# include <stack>
using namespace std;
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> s; // 存储pushed中的元素,将pushed中的元素转移到栈s中。
// i表示出栈序列中的第i位,j表示入栈序列中的第j位。
int j = 0;
for (int i = 0; i < popped.size(); i++) {
// 将栈pushed中的元素转移到栈s中。
// 判断栈s的栈顶元素是不是当前出栈序列对应的元素,如果不是,则将栈pushed对应位置的元素转移到站s中。
while (j < pushed.size() && (s.empty() || s.top() != popped[i])) {
s.push(pushed[j]);
j++;
}
// 判断栈顶元素是否等于出栈序列当前元素。
if (popped[i] != s.top()) {
return false;
}
// 当栈s的栈顶元素等于出栈序列对应的元素时,就从栈s中弹出栈顶元素。
s.pop();
}
return true;
}
};
int main() {
Solution *solution = new Solution();
vector<int> pushed = {1,2,3,4,5};
vector<int> popped = {4,5,3,2,1};
printf("%d\n", solution->validateStackSequences(pushed, popped));
return 0;
}
- Python代码
# -*- coding: utf-8 -*-
from typing import List
class Solution:
def __init__(self):
pass
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
s: List[int] = [] # 存储pushed中的元素,将pushed中的元素转移到栈s中。
j: int = 0 # j表示入栈序列中的第j位。
for num in popped:
# 将栈pushed中的元素转移到栈s中。
# 判断栈s的栈顶元素是不是当前出栈序列对应的元素,如果不是,则将栈pushed对应位置的元素转移到站s中。
while j < len(pushed) and (0 == len(s) or s[-1] != num):
s.append(pushed[j])
j += 1
# 判断栈s的栈顶元素是否等于出栈序列当前元素。
if s[-1] != num:
return False
# 当栈s的栈顶元素等于出栈序列对应的元素时,就从栈s中弹出栈顶元素。
s.pop()
return True
def main():
solution = Solution()
pushed = [1, 2, 3, 4, 5]
popped = [4, 5, 3, 2, 1]
print(solution.validateStackSequences(pushed, popped))
if __name__ == "__main__":
main()
说明
- 对应LeetCode第946题。
- 链接:https://leetcode-cn.com/problems/validate-stack-sequences/