基本思想:
队列尾的元素即是栈顶元素。
push操作时,把元素全部放入队列1。
pop操作时,如果队列1的元素数量不为1,先把队列1的元素依次放入队列2,直到队列1的元素数量为1,得到队列1的头元素,即为栈顶元素。然后把队列2的元素重新放回队列1。
top操作跟pop操作类似。只是在得到队列1头元素之后把头元素放回了队列2。然后把队列2的元素重新放回队列1。
#include <iostream>
#include <queue>
#include <stdexcept>
using namespace std;
class CStack
{
public:
void push(int node)//把元素全部放入队列1
{
q1.push(node);
}
void pop()
{
if(q1.empty()&&q2.empty()) throw runtime_error("stack is empty");
while(q1.size()!=1)//如果队列1元素数量不为1,把q2的元素依次放入队列2,直到队列1元素数量为1
{
q2.push(q1.front());
q1.pop();
}
q1.pop();
while(q2.size())//把q2的元素放回队列1
{
q1.push(q2.front());
q2.pop();
}
}
int top()
{
while(q1.size()!=1)//如果队列1元素数量不为1,把q2的元素依次放入队列2,直到队列1元素数量为1
{
q2.push(q1.front());
q1.pop();
}
int res= q1.front();//得到队列头节点
q2.push(q1.front());
q1.pop();//把队列头结点放入队列2
while(q2.size())//重新把q2的元素放回队列1
{
q1.push(q2.front());
q2.pop();
}
return res;
}
bool empty()
{
return (q1.empty()&&q2.empty());
}
private:
queue<int> q1;
queue<int> q2;
};
void print_stack(CStack s)
{
while(!s.empty())
{
cout<<s.top()<<endl;
s.pop();
}
}
int main()
{
CStack s;
// s.pop();
s.push(1);
s.push(2);
s.push(3);
print_stack(s);
cout<<s.top()<<endl;
s.pop();
print_stack(s);
}