问题描述:
- 给定
pushed
和 popped
两个序列,每个序列中的值都不重复,只有当它们可能是在最初空栈上进行的推入 push
和弹出 pop
操作序列的结果时,返回 true
;否则,返回 false
。
- 数组
pushed
中的元素互不相同; - 数组
poped
和数组 pushed
的长度相同; - 数组
popped
是数组 pushed
的一个排列。
核心思路:
- 该题是直接用栈
stk
模拟即可。
- 从左往右往
stk
中存入 pushed
数组的值,如此 pushed
数组中所有值都进行了一次入栈操作。 - 在存入
pushed
的过程中,维护一个访问 poped
数组的索引(索引从 0
开始),只要栈顶元素和索引对应值相等,就弹出栈顶并将索引后移。【因为数组中值各不相同,所以只要栈顶和索引对应值匹配,就说明是唯一匹配】 - 在最后,如果
poped
中所有元素均出栈一次,则说明 poped
是 pushed
的一次出栈结果。
代码实现:
class Solution
{
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped)
{
int m = pushed.size();
stack<int> stk;
int j = 0;
for(int i = 0; i < m; ++i)
{
stk.push(pushed[i]);
while(j < m and !stk.empty() and stk.top() == popped[j])
{
stk.pop();
++j;
}
}
return stk.empty();
}
};