【剑指offer】面试题9 两个栈实现队列/两个队列实现栈

1.考点:

  • 考点1:栈和队列的运行机制理解,以及两者之间的相互关系理解;
  • 考点2:模板的理解(模板写的比较多了所以这里没用模板写)

2.思想

  • 队是先进先出,栈是先进后出,两者相互实现时,把思路理清就OK。
  • (1)两个栈实现队列:两个栈当两个杯子A和B,加水(push)都往A里面push;而删除(pop)都从B的顶端进行删除,当B中没有水时,向A申请加水,A会把所有的水全部倒进来,然后B倒出最上面的那点水(这点水就是A中最底层最先进来的数据);
  • (2)两个队列实现栈:保证只有一个队列有数据,即两个队列AB之间来回倒,push数据时向有数据的那个队列push(两队列都没有数据时默认为A);pop数据时,将有数据的队列倒入另一个没数据的队列,途中克扣掉最后的数据(也就是栈中刚刚加进去的数据)进行删除,实现pop。

3.代码

#include <iostream>
#include <stack>
#include <queue>
using namespace std;

//两个栈实现队列(一存一删,资源申请)牛客网3ms 488K
class Solution
{
public:
	//栈1中push数据
	void push(int node) 
	{
		stack1.push(node);
	}

	int pop() 
	{
		//1.先判断栈2是否为空,空则申请数据
		if (stack2.size() <= 0)
		{
			while (stack1.size() > 0)
			{
				stack2.push(stack1.top());
				stack1.pop();
			}
			//申请完后判断栈2有没有数据(异常处理为了过牛客网可改成return 0)
			if (stack2.size() <= 0)
				throw new exception("queue is empty!");
		}
		//2.在栈2中删数据
		int head = stack2.top();
		stack2.pop();

		return head;
	}

private:
	//栈1存数据,栈2删数据,栈2数据来自栈1的倾倒,当其为空时向栈1申请
	stack<int> stack1;
	stack<int> stack2;
};

//两个队列实现栈(循环使用,插有数据的,在队伍切换中删)
class Solution2
{
public:
	void push(int node)
	{
		if (queue2.size() > 0)
			queue2.push(node);
		else
			queue1.push(node);
	}

	int pop()
	{
		//如果队列2有数据,则往队列1倒,同时克扣下最后的数据
		if (queue2.size() > 0)
		{
			while (queue2.size() > 1)
			{
				queue1.push(queue2.front());
				queue2.pop();
			}
			int head = queue2.front();
			queue2.pop();
			return head;
		}
		else if (queue1.size() > 0)
		{
			while (queue1.size() > 1)
			{
				queue2.push(queue1.front());
				queue1.pop();
			}
			int head = queue1.front();
			queue1.pop();
			return head;
		}
		else
			throw new exception("queue is empty!");
	}

private:
	//栈1存数据,栈2删数据,栈2数据来自栈1的倾倒,当其为空时向栈1申请
	queue<int> queue1;
	queue<int> queue2;
};

int main()
{
	//Solution Cstack;
	Solution2 Cstack;
	Cstack.push(1);
	Cstack.push(2);
	Cstack.push(3);
	Cstack.push(4);
	Cstack.push(5);

	cout << Cstack.pop() << endl;
	cout << Cstack.pop() << endl;
	cout << Cstack.pop() << endl;
	cout << Cstack.pop() << endl;
	cout << Cstack.pop() << endl;
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方寸间沧海桑田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值