两个栈实现一个队列(图解),一看就懂

两个栈实现一个队列

要想实现此方法,我们现需要了解一下什么是栈和队列。

栈(Stack是一种只能在一端进行插入或删除操作的线性表。) 表中允许进行插入、删除操作的一端称为栈顶(Top)。栈顶的当前位置是动态的,栈顶的当前位置是由一个称为栈顶指针的位置指示器指示。表的另一端称为栈底(Bottom)。当栈中没有数据元素时称为空栈。栈的插入操作称为进栈或入栈(Push),删除操作称为退栈或出栈(Pop)。

栈的主要特点是 “后进先出”,即后进栈的元素先弹出。每次进栈的数据元素都放在原当前栈顶元素之前成为新的栈顶元素,每次出栈的数据元素都是当前栈顶元素。栈也称为后进先出表。

队列

队列简称队(Queue),它也是一种操作受限的线性表,其限制为仅允许在表的一端进行插入,而在表的另一端进行删除。把进行插入的一端称做队尾(rear),进行删除的一端称做队首或队头(front)。向队列中插入新元素称为进队或入队,新元素进入后就成为新的队尾元素;从队列中删除元素称为出队或离队,元素出队后,其直接后继元素就成为队首元素。

由于队列的插入和删除操作分别是在各自的一端进行的,每个元素必然按照进入的次序出队,所以又把队列称为先进先出表

解题思路

1、因为队列是先进先出,栈是后进先出,所以我们可以将两个栈当作两个杯子,添加元素就相当于往里面放正方体。
2、队列的添加元素是从队尾插入,所以每当放入第一个杯子里的正方体,我们将第一个正方体再放入第二个杯子,将第二个物体放到第一个杯子,再把第二个杯子里的第一个正方体放到第一个杯子的第二个物体上,以此类推放置五个,就是我们实现队列的效果了。
3、为了避免队列的顺序错乱,所以我们在做添加或输出是保持另一个栈为空。

图解

在这里插入图片描述
在这里插入图片描述
我们保持栈2为空,通过栈2来将五个元素过度一下,栈2的作用就是相当于一个中介,只是通过栈2来调整顺序以实现队列的效果。

代码实现

#include<stack>
class ToQueue
{
public:
	ToQueue(){}
	~ToQueue(){}
	int back();//返回最后一元素
	bool empty();//判断队列是否为空
	int front();//返回第一个元素
	void pop();//删除第一个元素
	void push(int num);//在末尾添加一个元素
	int size();//返回第一个元素
private:
	stack<int> stack1;//栈1
	stack<int> stack2;//栈2
#include "ToQueue.h"

int ToQueue::back()//返回最后一个元素
{
	while (!stack1.empty())//当栈1不为空
	{
		stack2.push(stack1.top());//把栈1的第一个元素返回到栈2
		stack1.pop();//删除栈1的第一个元素
	}
	int i = stack2.top();//定义临时变量保存栈2的栈顶元素,
	                     //此变量就为队的第一个元素
	while (!stack2.empty())//当栈2不为空
	{
		stack1.push(stack2.top());//将栈2的栈顶元素添加到栈1末尾
		stack2.pop();//移除栈2栈顶元素
	}
	return i;//返回临时变量
}
bool ToQueue::empty()//判断队列是否为空
{
	return stack1.empty();//判断栈1是否为空
}
int ToQueue::front()//返回队列第一个元素
{ 
	return stack1.top();//返回栈1的第一个元素
}
void ToQueue::pop()//删除第一个元素
{
	return stack1.pop();//删除栈1的第一元素
}
void ToQueue::push(int num)//在末尾添加一个元素
{
	while (!stack1.empty())//当栈1不为空时
	{
		stack2.push(stack1.top());//将栈1的第一个元素添加到栈2的栈顶
		stack1.pop();//移除栈1的栈顶元素
	}
	stack1.push(num);//添加元素到栈1的栈顶
	while (!stack2.empty())//当栈2不为空
	{
		stack1.push(stack2.top());//将栈2的第一个元素添加到栈1的栈顶
		stack2.pop();//移除栈2的栈顶元素
	}
}
int ToQueue::size()//返回队列中元素的个数
{
	return stack1.size();//返回栈1的计数器
}
int main()
{
	ToQueue tq;
	tq.push(1);
	tq.push(2);
	tq.push(3);
	tq.push(4);
	tq.push(5);
	tq.push(6);
	cout << "打印队列" << endl;
	while (!tq.empty())
	{
		cout << tq.front()<< endl;
		tq.pop();
	}

}

输出的结果为:在这里插入图片描述
由此可见,我们通过两个栈实现了队列的功能。
如有问题欢迎指出,希望大家多多点评!

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值