现在的位置: 首页 > 综合 > 正文

用两个栈实现一个队列:实现出队列和入队列功能,用两个队列实现一个栈

2013年08月07日 ⁄ 综合 ⁄ 共 1567字 ⁄ 字号 评论关闭

思路:用两个栈来模仿队列,就是要用两个后进先出的数据结构来实现先进先出的功能。
举个简单的例子:(用#代表栈底,->表示队列的方向)
初始状态:可以知道,这是可行的,如果需要出队列,只需要stack1不停弹栈即可
stack 1: #4,3,2,1
stack 2: #
queue:4,3,2,1->
此时如果需要入队列,那么队列就应该是这样子:queue : 5,4,3,2,1->
如何用栈来模拟呢?可以这么做!
step 1: 把stack 1的值全弹出到stack2
step 2: 把5压入栈stack 1
step 3: 把stack 2的值全弹出到stack1
根据这个思路可以写出如下代码:

#include<stack>
#include<iostream>
using namespace std;
struct Queue
{
private:
	stack<int> st1;//保存内容
	stack<int> st2;//缓冲区
public:
	void push(int _val)
	{
		int _Temp;
		while(!st1.empty())
		{
			_Temp=st1.top();
			st1.pop();
			st2.push(_Temp);
		}
		st1.push(_val);
		while(!st2.empty())
		{
			_Temp=st2.top();
			st2.pop();
			st1.push(_Temp);
		}
	}
	int pop()
	{
		if(st1.empty())
		{
			std::cout<<"Empty Queue!"<<std::endl;
			return -1;
		}
		int _Temp=st1.top();
		st1.pop();
		return _Temp;
	}
};
int main()
{
	int A[]={4,3,7,9,11,35};
	int len=sizeof(A)/sizeof(A[0]);
	Queue Q;
	for(int i=0;i<len;++i)
	{
		Q.push(A[i]);
	}
	for(int i=0;i<len;++i)
	{
		cout<<Q.pop()<<' ';
	}
	return 0;
}

用两个队列实现一个栈同理也比较容易。

举个例子:

queue 1 : 5,4,3,2,1->

queue 2 :->

stack : #5,4,3,2,1

当需要弹栈的时候,只需要非空队列出列即可。

当需要压栈 (6) 的时候,栈会变成stack : # 5,4,3,2,1,6

队列模拟应该是:

1.6进空队列

2.非空队列压到空队列。

代码如下:

#include<iostream>
#include<queue>
using namespace std;
class stack
{
private:
	queue<int> q1;
	queue<int> q2;
public:
	void push(int _val)
	{
		int _Temp;
		if(q1.empty())
		{
			q1.push(_val);
			
			while(!q2.empty())
			{
				_Temp=q2.front();
				q2.pop();
				q1.push(_Temp);
			}
		}
		else
		{
			q2.push(_val);
			
			while(!q1.empty())
			{
				_Temp=q1.front();
				q1.pop();
				q2.push(_Temp);
			}
		}
	}
	int pop()
	{
		if(!q1.empty())
		{
			int _Temp=q1.front();
			q1.pop();
			return _Temp;
		}
		else
		{
			int _Temp=q2.front();
			q2.pop();
			return _Temp;
		}
	}
};
int main()
{
	int A[]={4,3,7,9,11,35};
	int len=sizeof(A)/sizeof(A[0]);
	stack st;
	for(int i=0;i<len;++i)
	{
		st.push(A[i]);
	}
	for(int i=0;i<len;++i)
	{
		cout<<st.pop()<<' ';
	}
	return 0;
}

抱歉!评论已关闭.