用两个队列实现一个栈的功能操作C++

本文介绍如何使用两个队列来模拟栈的基本操作,如push和pop。在该方法中,push操作始终将元素添加到非空队列,而pop操作则处理当前非空队列并将其元素转移到另一个队列,确保了操作的时间复杂度为O(1)。
解法:
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;
    }

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值