题目描述
思路
模拟
根据题意,pushed和popped两个数组有如下性质:
- 数组pushed的元素互不相同;
- 两个数组长度一致;
- popped数组是pushed数组的一种排列方式。
根据这些性质,有如下结论: - 实现时,栈中不可能出现重复元素;
- 如果pushed和popped是有效的栈操作序列,则经过所有的入栈出栈操作后,每个元素各入栈出栈一次,栈为空。
因此,可以遍历两个数组,模拟入栈和出栈操作,判断两个数组是否为有效的栈操作序列。
模拟入栈操作可以通过pushed数组实现,由于只有栈顶元素可以出栈,因此模拟出栈操作需要判断栈顶元素是否与popped数组当前元素相同,如果相同则将栈顶元素出栈。由于元素互不相同,因此当栈顶元素与popped数组的当前元素相同时,必须将栈顶元素出栈,否则出栈顺序一定和popped数组不同。
所以具体的操作应为:遍历pushed数组,将pushed数组依次入栈后,如果栈不为空且栈顶元素与popped数组的当前元素相同,则将栈顶元素出栈,同时遍历popped数组,直到栈为空或栈顶元素与popped数组的当前元素不同。遍历pushed数组结束后,每个元素都按照pushed数组的顺序入栈一次。如果栈为空,则每个元素都按照数组popped的顺序出栈返回true,如果栈不为空,则元素不能按照popped数组的顺序出栈,返回false。
Python实现
class Solution:
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
s, i = [], 0
for x in pushed:
s.append(x)
while s and s[-1] == popped[i]:
s.pop()
i += 1
return len(s) == 0
Java实现
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
Deque<Integer> stack = new ArrayDeque<Integer>();
int n = pushed.length;
for (int i = 0, j = 0; i < n; i++) {
stack.push(pushed[i]);
while (!stack.isEmpty() && stack.peek() == popped[j]) {
stack.pop();
j++;
}
}
return stack.isEmpty();
}
}
C++实现
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> st;
int n = pushed.size();
for (int i = 0, j = 0; i < n; i++) {
st.emplace(pushed[i]);
while (!st.empty() && st.top() == popped[j]) {
st.pop();
j++;
}
}
return st.empty();
}
};