两个栈实现队列;两个队列实现栈

本文介绍使用两个栈实现队列的功能,以及利用两个队列实现栈的操作。通过具体的C++代码示例展示了如何进行数据结构的转换,并讨论了不同场景下的优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、两个栈实现队列

思路:s1是入栈的,s2是出栈的。

  入队列时:直接压入s1即可

  出队列时:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素



<span style="font-size:18px;">//两个栈实现一个队列,完成入栈和出栈功能
#include <iostream>
#include <stack>
using namespace std;


class Queue
{
	stack<int>s1;
	stack<int>s2;
public:
	Queue()
	{}
	~Queue()
	{}
	void push(int data);
	void pop();

};

void Queue::push(int data)
{
	s1.push(data);
}
void Queue::pop()
{
	if(s2.empty())//s2为空栈,把s1全部倒入s2中
	{
		if(s1.empty())//s1也为空栈,退出
		{
			cout<<"empty"<<endl;
			return;
		}
		while(!s1.empty())//全部倒入
		{
			s2.push(s1.top());
			s1.pop();
		}
		
	}
	cout<<s2.top()<<endl;
	s2.pop();
}
void main()
{
	Queue q;
	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	q.pop();
	q.pop();
	q.pop();
	q.push(5);
	q.push(6);
	q.pop();
	q.pop();
	q.pop();
	q.pop();
	system("pause");
}</span>


2、两个队列实现栈

思路:q1是专职进出栈的,q2只是个中转站

  入栈时:直接入队列q1即可

  出栈时:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中

图示:

改进:两个队列的功能不确定,即既可以作为进出栈,又可以作为中转站

定义两个指针:pushtmp:所指专门进栈的队列; tmp:指向临时作为中转站的另一个栈。

  入栈时:直接入pushtmp所指队列即可

  出栈时:把pushtmp的除最后一个元素外全部转移到队列tmp中,然后把刚才剩下q1中的那个元素出队列。转移到另外一个队列后不用返回了,这样减少了转移的次数。

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

//两个队列实现栈,完成入栈、出栈功能
class Stack
{
	queue<int>q1;
	queue<int>q2;
	int inq;//指示作为入栈、出栈的队列
public:
	Stack()
	{
		inq=0;
	}
	~Stack()
	{}
	void push(int data);
	void pop();
	int top();
};

void Stack::push(int data)
{
	if(inq==0)
		q1.push(data);
	else
		q2.push(data);
}

void Stack::pop()
{
	if(inq==0)
	{
		int n=q1.size();
		if(n==0)
			return;
		for(int i=0;i<n-1;i++)
		{
			q2.push(q1.front());
			q1.pop();
		}
		cout<<q1.front()<<endl;
		q1.pop();
		inq=1;
	}
	else
	{
		int n=q2.size();
		if(n==0)
			return;
		for(int i=0;i<n-1;i++)
		{
			q1.push(q2.front());
			q2.pop();
		}
		cout<<q2.front()<<endl;
		q2.pop();
		inq=0;
	}
}


void main()
{
	Stack s;
	s.push(1);
	s.push(2);
	s.push(3);
	s.push(4);
	s.pop();
	s.pop();
	s.pop();
	s.push(5);
	s.pop();
	s.pop();
	s.pop();
	s.pop();
	system("pause");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值