用俩个栈实现队列

来源:互联网 发布:精确日语翻译软件 编辑:程序博客网 时间:2024/06/03 05:41
栈、队列

一、题目:(感谢 http://blog.csdn.net/v_JULY_v 提供的题目)

用俩个栈实现队列。

某队列的声明如下:
template<typename T>class CQueue{public:    CQueue() {}    ~CQueue() {}    void appendTail(const T& node); // append a element to tail    void deleteHead(); // remove a element from headprivate:    Stack<T> m_stack_in;    Stack<T> m_stack_out;};
分析:从上面的类的声明中,我们发现在队列中有两个栈。
因此这道题实质上是要求我们用两个栈来实现一个队列。

栈是一种后入先出的数据容器,对队列进行的插入和删除操作都是在栈顶上进行;
队列是一种先入先出的数据容器,我们总是把新元素插入到队列的尾部,而从队列的头部删除元素。

二、分析:
1.设定A栈用于保存队列信息,B栈为辅助栈
2.入列,如同入栈(A)操作
3.出列,把出栈(A)的元素入栈(B),至A栈中的最后一位舍去,把出栈(B)的元素入栈(A),完成出列的过程



三、代码:
#include<iostream>using namespace std;const int stackSize = 10;template<typename T> class Stack{public:Stack() {size = -1;}~Stack(){}void push(const T& node);//入栈  T pop();//出栈  void printStack();//输出栈中所有元素 int size;//栈大小  private:int stackArray[stackSize];//保存栈元素};template<typename T> void Stack<T>::push(const T& node){if(size == stackSize-1) throw "上溢出";else stackArray[++size] = node;}template<typename T>T Stack<T>::pop(){if(size == -1) throw "下溢出";  else return stackArray[size--];}template<typename T>void Stack<T>::printStack(){for(int i=0;i<=size;i++) cout<<stackArray[i]<<"  ";cout<<endl;}template<typename T> class CQueue{public:CQueue() {}~CQueue() {}void appendTail(const T& node); // append a element to tailvoid deleteHead(); // remove a element from headprivate:Stack<T> m_stack_in;Stack<T> m_stack_out;};template<typename T> void CQueue<T>::appendTail(const T& node){m_stack_in.push(node);m_stack_in.printStack();}template<typename T> void CQueue<T>::deleteHead(){int size = m_stack_in.size;for(int i=0;i<size;i++) m_stack_out.push(m_stack_in.pop());m_stack_in.size = -1;size = m_stack_out.size;for(int i=0;i<=size;i++) m_stack_in.push(m_stack_out.pop());m_stack_out.size = -1;m_stack_in.printStack();}void main(){CQueue<int> cq;cout<<"入列  ";cq.appendTail(1);cout<<"入列  ";cq.appendTail(2);cout<<"入列  ";cq.appendTail(3);cout<<"出列  ";cq.deleteHead();cout<<"出列  ";cq.deleteHead();cout<<"入列  ";cq.appendTail(4);cout<<"出列  ";cq.deleteHead();cout<<"出列  ";cq.deleteHead();cout<<"入列  ";cq.appendTail(5);}

四、进阶:
两个队列实现栈。
分析:栈使用数组实现比较方便;而队列使用链表实现比较方便。
原创粉丝点击