栈实现队列,队列实现栈

栈实现队列:

思想:是有两个栈,一个用来放数据(数据栈),一个用来辅助(辅助栈)。数据添加时,会依次压人栈,取数据时肯定会取栈顶元素,但我们想模拟队列的先进先出,所以就得取栈底元素,那么辅助栈就派上用场了,把数据栈的元素依次弹出到辅助栈,但保留最后一个元素,最后数据栈就剩下了最后一个元素,直接把元素返回,这时数据栈已经没有了数据。最后呢,把辅助栈的元素依次压人数据栈,这样,我们成功取到了栈底元素。

代码如下:

class Queue
{
public:
	void push(int data)//入栈时,无论两个栈是什么情况,都只往s1中入
    {
		s1.push(data);
    }
	int pop()
	{
		if(s1.empty() && s2.empty())
        {
            cout << "The queue is empty";
        }
        if (!s2.empty()) 
        {
           int val = s2.top();
		   s2.pop();
		   return val;
        }
        else
        {
            while (!s1.empty())
            { 
                s2.push(s1.top());
                s1.pop();
            }
        }
	}
private:
	stack<int> s1;
	stack<int> s2;
};

队列实现栈:

思想:有数据队列和辅助队列,模拟栈的先进后出,队列是队尾进队头出,也就是说每次取值要取队列的队尾元素,数据队列出队到辅助队列,留下最后一个元素返回,辅助队列再把元素出队到数据队列

代码如下:

class stack
{
public:
	void push(int data)  //保证任何时候只有一个队列中有元素
	{
		if(q1.empty() && q2.empty())
		{
			q1.push(data);
		}
		if(q1.empty() && !q2.empty())
		{
			q2.push(data);
		}
		if(!q1.empty() && q2.empty())
		{
			q1.push(data);
		}
	}
	int pop()
	{
		int val;
		if(q1.size() != 0)//处理q1的元素
		{
			while(q1.size() > 1)//非空队列中除最后一个元素入另一个队,最后一个元素出队,相当于出栈
			{		
				q2.push(q1.front());
				q1.pop();
			}
			val = q1.front();
			q1.pop();
		}
		else //处理q2的元素
		{
			while(q2.size() > 1)
			{		
				q1.push(q2.front());
				q2.pop();
			}
			val = q2.front();
			q2.pop();
		}
		return val;
	}
private:
	queue<int> q1;
	queue<int> q2;
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值