法1:辅助栈
同时用两个指针i, j分别指向两个序列的头部,
- 每次我们先将i所指向的元素压入栈中, 然后i向后移动一步, 之后再检查当前栈顶, 若对应上了弹出序列中j所指向的元素, 则弹出元素,
- j向后移动, 再继续检查, 直到栈空或栈顶元素和j所指元素不等为止
class Solution {
public:
stack<int> s1;
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
// write code here
int len = pushV.size();
int i = 0;
int j = 0;
while(i < len){
s1.push(pushV.at(i));
while(!s1.empty() && s1.top() == popV[j]){
++j;
s1.pop();
}
++i;
}
return j == len;
}
};
法2:直接在数组上操作
- 当
pushV[i] != popV[0]元素,表示还没匹配到待弹出元素;继续i = i + 1压入元素; - 当
push[i] == popV[0]时,即匹配上弹出元素,并i = i – 1让它始终指向pushV的顶部元素;同时popV也要更新到下一个元素j = j + 1,使其成为新的popV[0]。最后直到pushV 和popV都为空即匹配结束。
class Solution {
public:
stack<int> s1;
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
// write code here
int i = 0;
int j = 0;
for(auto p : pushV){
pushV[i] = p; // 这一步是模拟入栈操作
while(i>=0 && pushV[i] == popV[j]){
j++;
i--;
}
i++;
}
return i == 0; // 检查最后的栈是否为空
}
};