您的位置:首页 > 其它

用两个栈实现队列

2015-10-16 21:26 204 查看
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列的尾部插入节点和在队列的头部删除节点的功能。
解析:队列的特点是先进先出,而栈的特点是后进先出。首先,我们声明两个栈s1和s2,入队列的元素,我们都插入在s1中。出队列的元素,我们都从s2中进行弹出元素。也就是appendTail操作只在s1中进行,deleteHead(int &val)操作只在s2中进行。出队列时可以分为三种情况,(1)两个栈s1和s2都为空,返回false。(2)栈s1为空,而s2不为空,直接从s2中弹出要出队的元素,把出队元素保存在一个变量中。(3)栈s2不为空,直接从s2中弹出元素保存在变量中。
#include<iostream>
#include<stack>
using namespace std;

class CQueue
{
private:
	stack<int> s1;//入队列时,进入的栈
	stack<int> s2;//出队列时,弹出的栈
public:
	void appendTail(int val)//入队的操作
	{
		s1.push(val);
	}

	bool deleteHead(int &val)//出队列操作,出队元素保存在val中
	{
		if(s2.empty() && s1.empty())//判断两个栈是否为空
		{
			return false;
		}
		if(!s2.empty())//s2不为空格
		{
			val = s2.top();
			s2.pop();
			return true;
		}
		if(s2.empty() && !s1.empty())//s2为空,s1不为空
		{	
			while(!s1.empty())
			{
				s2.push(s1.top());
				s1.pop();
			}
			val = s2.top();
			s2.pop();
			return true;
		}
	}
};

int main(void)
{
	CQueue q;
	int val;
	q.appendTail(3);
	q.appendTail(4);
	while(q.deleteHead(val))
	{
		cout<<val<<" ";
	}
	cout<<endl;
	system("pause");
	return 0;
}
输出结果:
3 4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: