两个栈实现一个队列

使用两个栈实现一个队列,队列的声明如下,实现他的两个函数,分别完成在队列尾部插入节点和在队列头部删除节点
实例:往该队列中插入和删除元素的过程。首先插入一个元素a,不妨先把它插入到stack1,此时,stack1中的元素有a,stack2为空...继续插入。

    从队列中删除一个元素。按照队列先入先出的规则,最先被删除的应该是 a,元素 a 存储在stack1中,但并不在栈顶上,因此不能直接删除。当stack2不为空的时候,在stack2中的栈顶元素时最先进入队列的元素,可以弹出,若stack2 为空,此时可以将stack1中的元素逐个弹出,压入stack2中,元素在stack2中的顺序正好和原来在stack1中的顺序相反。

/*
 使用两个栈实现一个队列,队列的声明如下,实现他的两个函数,分别完成在队列尾部插入节点和在队列头部删除节点
*/
#include<iostream>
#include<stack>

using namespace std;
template<class T> class CQueue
{
public:
 CQueue(){}
 ~CQueue(){}

 void appendTail(const T& element);
 T deleteHead();

private:
 stack<T> stack1;
 stack<T> stack2;
};

template<class T> void CQueue<T>::appendTail(const T& element)
{
 stack1.push(element);
}

template<class T> T CQueue<T>::deleteHead()
{
 if(stack2.empty())    //stack2为空时,若stack1也为空则队列为空
 {
  if(stack1.empty())
   throw exception("queue is empty!");
  while(!stack1.empty())
  {
   stack2.push(stack1.top());
   stack1.pop();
  }
  
 }
 T head = stack2.top();
 stack2.pop();
 return head;
}

int main()
{
 CQueue<char> Qu;
 char value;
 cin >> value;
 Qu.appendTail('a');

 Qu.appendTail('b');

 Qu.appendTail('c');
 cout << "出队: ";
 cout << Qu.deleteHead() << " ";
 cout << Qu.deleteHead() << " ";

 Qu.appendTail('d');
 cout << Qu.deleteHead() << " ";
 cout << Qu.deleteHead() << " ";

 system("pause");
 return 0;
}

你可能感兴趣的:(删除,插入,使用两个栈实现一个队列)