解法:
1.有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。
2.现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。
3.如果继续做push操作,比如插入d,f,则把d,f插入到q2中,
4.此时若要做pop操作,则做步骤2
5.以此类推,就实现了用两个队列来实现一个栈的目的。
1.有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。
2.现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。
3.如果继续做push操作,比如插入d,f,则把d,f插入到q2中,
4.此时若要做pop操作,则做步骤2
5.以此类推,就实现了用两个队列来实现一个栈的目的。
注意在此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。
对于push和pop操作,其时间为O(n).
#include<iostream>
#include<stdlib.h>
#include<stack>
#include<queue>
using namespace std;
template <typename T>class CStack
{
public:
CStack(void){};
~CStack(void){};
void push(const T& node);
T pop();
private:
queue<T> queue1;
queue<T> queue2;
};
//插入元素
template <typename T>void CStack<T>::push(const T& node)
{
if(queue1.size()>0)//如果queue1不为空则往queue1中插入元素
queue1.push(node);
else if(queue2.size()>0)//如果queue2不为空则往queue1中插入元素
queue2.push(node);
else //如果两个队列都为空,则往queue1中插入元素
queue1.push();
}
//队列的限制性,只能在队尾插入元素,在队头删除元素。
template <typename T>T CStack<T>::pop()
{
if(queue1.size()==0)//如果queue1为空
{
while(queue2.size()>1)//保证queue2中有一个元素,将其余元素保存到queue1中
//此时是>1 则会将最后一个元素留在queue2 中,这个元素就是要删除的那个元素。
{
queue1.push(queue2.front());
queue2.pop();
}
T&data=queue2.front();//将queue2中的那个最后的元素直接取出后再pop 掉。
queue2.pop();
return data;
}
else//如果queue2为空
{
while(queue1.size()>1)//保证queue2中有一个元素,将其余元素保存到queue1中
{
queue2.push(queue1.front());
queue1.pop();
}
T& data=queue1.front();
queue1.pop();
return data;
}
}
本文介绍如何使用两个队列来模拟栈的基本操作,如push和pop。在该方法中,push操作始终将元素添加到非空队列,而pop操作则处理当前非空队列并将其元素转移到另一个队列,确保了操作的时间复杂度为O(1)。
2232

被折叠的 条评论
为什么被折叠?



