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

57 用俩个栈实现队列

2018年05月02日 ⁄ 综合 ⁄ 共 1273字 ⁄ 字号 评论关闭

57.用俩个栈实现队列。
题目:某队列的声明如下: 
83
template<typename T> class CQueue
{
public:
CQueue() {}
~CQueue() {}
void appendTail(const T& node);  // append a element to tail
void deleteHead();  // remove a element from head
private:
Stack<T> m_stack1;
Stack<T> m_stack2;
};
分析:从上面的类的声明中,我们发现在队列中有两个栈。
因此这道题实质上是要求我们用两个栈来实现一个队列。
相信大家对栈和队列的基本性质都非常了解了:栈是一种后入先出的数据容器,
因此对队列进行的插入和删除操作都是在栈顶上进行;队列是一种先入先出的数据容器,

我们总是把新元素插入到队列的尾部,而从队列的头部删除元素。

/*
57.用俩个栈实现队列。
题目:某队列的声明如下: 
template<typename T> class CQueue
{
	public:
		CQueue() {}
		~CQueue() {}
		void appendTail(const T& node);  // append a element to tail
		void deleteHead();  // remove a element from head
	private:
		Stack<T> m_stack1;
		Stack<T> m_stack2;
};

2个栈 s1,s2 
入队时,将元素压入s1。
出队时,判断s2是否为空,
	如不为空,则直接弹出顶元素;
	如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。
*/
#include <iostream>
#include <stack>
using namespace std;

template<class T>
class Queue
{
	private:
		stack<T> s1,s2;
	public:
		Queue(){}
		~Queue(){}
		
		void append(const T& node)// append a element to tail
		{
			s1.push(node);
		}
		
		void deleteHead() // remove a element from head
		{	
				if(s2.empty())//s2空,s1全部s2 
				{
					
					while(!s1.empty())
					{
						
						s2.push(s1.top());
						s1.pop();
					}
					cout<<"出队:"<<s2.top()<<endl;
					s2.pop();
				}
				else
				{
					cout<<"出队:"<<s2.top()<<endl;
					s2.pop();
				}
		}
};

int main() {

	Queue<char> q;
	
	q.append('a');
	q.append('b');
	q.append('c');
	q.append('d');
	q.deleteHead();
	q.deleteHead();
	
	cout<<"****************"<<endl;
	q.append('f');
	q.deleteHead();
	q.deleteHead();
	q.deleteHead();
	
	return 0;
}

抱歉!评论已关闭.