栈、队列
一、题目:(感谢
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 head private: 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 tail void deleteHead(); // remove a element from head private: 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); }
两个队列实现栈。
分析:栈使用数组实现比较方便;而队列使用链表实现比较方便。