题目
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列
我自己的一个栈一个队列实现
因为栈和队列的性质
栈是后进先出,队列是先进先出
所以我们正好可以利用这两个性质,对应题目给出来的两个数组进行操作
首先我们把popped里边的所有值压入一个队列中,由于队列的性质,出队顺序和入队顺序一样
我们遍历一次pushed数组
在遍历的同时我们比较压入的值和队列最顶端的值
如果栈为空并且压入的值和队列最顶端的值相同 我们不要压入栈 并且将队列最顶端的值弹出
如果栈不为空 则我们压入数据之前先栈顶的元素和队列顶端的元素相同
则我们弹出栈和队列最顶端的值
保证我们在压入栈之前 将和队列顶端值相等的元素都弹出
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> s;
queue<int> q;
for (int i = 0; i < popped.size(); i++) {
q.push(popped[i]);
}
for (int i = 0; i < pushed.size(); i++) {
if (pushed[i] != q.front()) {
s.push(pushed[i]);
//栈中压入
}
else {
q.pop();//队列弹出一个
}
while ((!s.empty() && !q.empty()) && (q.front() == s.top())) {
s.pop();
q.pop();
}
}
//添加完毕
while (!s.empty() && !q.empty()) {
if (s.top() == q.front()) {
s.pop();
q.pop();
}
else {
return false;
}
}
return s.empty();
}
可能时间复杂度和空间复杂度都比较高,但是这是我刚开始就想到的解法
所以就硬着头皮写下来了
一个栈的解法
后边看题解,发现一个栈也可以实现相同的工作
而且效率更高
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> s;
int k = 0;
for (auto n : pushed) {
s.push(n);
while (!s.empty() && s.top() == popped[k]) {
k++;
s.pop();
}
}
return s.empty();
}
希望我所写的对大家有所帮助