如何解决使用两个堆栈实现队列时使用 swap() STL 时出错
我试图使用两个堆栈来实现类队列,但我注意到一个错误。如果我交换两个堆栈(在弹出和前端操作之后),使用 STL 的 swap() 操作,我会得到错误的答案,但是当我使用静态代码交换两个堆栈时,我会得到正确的答案。 请让我知道到底发生了什么。
#include <bits/stdc++.h>
using namespace std;
template<typename T>
class Queue{
stack<T> A;//non empty stack
stack<T> B;
public:
void push(T x){//O(1)
A.push(x);
};
void pop(){//O(n)
if(A.empty()) return;
while(A.size()>1){
T element=A.top();
A.pop();
B.push(element);
}
//1 element remaining in A
A.pop();
//swap(A,B);//so that A is the non empty stack
//using swap() in this case was giving wrong answer
while(!B.empty()){
T element=B.top();
B.pop();
A.push(element);
}
};
int front(){//O(n)
while(A.size()>1){
T element=A.top();
A.pop();
B.push(element);
}
T element = A.top();
A.pop();
B.push(element);
while(!B.empty()){
T element = B.top();
B.pop();
A.push(element);
}
return element;
};
int size(){
return A.size()+B.size();
};
bool empty(){
return size()==0;
};
};
int main() {
Queue<int> q;
q.push(2);
q.push(3);
q.push(4);
q.pop();
q.push(15);
while(!q.empty())
{
cout<<q.front()<<" ";
q.pop();
}
return 0;
}
还有一件事,在此之前我使用两个队列实现了 Stack,并且 swap() 给出了正确的答案。
解决方法
当您手动交换堆栈时,您可以通过从堆栈顶部取出一个元素并将其放在另一个顶部来实现。这将颠倒堆栈中元素的顺序。
当您使用 std::swap
交换两个堆栈时,将保留当前顺序。最终的结果是堆栈中的顺序颠倒了。通过使用另一个手动“交换”,您可以重新反转所有元素并恢复原始顺序(但删除了底部元素,因为您在交换期间没有将其添加到 B
堆栈中)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。