题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能
解题思路
一个队列包含了两个栈stack1和stack2,因此这道题的意图是要求我们操作这两个“先进后出”的栈实现一个“先进先出”的队列CQueue。对于两个栈而言,对于插入操作,不妨假设都先插入到stack1,也就实现了入队操作。但是出队操作,则需要借助stack2的过渡:
当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出。如果stack2为空时,我们把stack1中的元素逐个弹出并压入stack2。由于先进入队列的元素被压到stack1的底端,经过弹出和压入之后就处于stack2的顶端了,又可以直接弹出。下图展示了一个使用两个栈实现队列的实
#include <iostream> #include <stack> #include <stdexcept> using namespace std; template <typename T> class Q { public: void push(int a[],int len); void pop(); private: stack<T> s1,s2; }; template <typename T> void Q<T>::push(int a[],int len) { for(int i=0;i<len;++i) s1.push(a[i]); } template <typename T> void Q<T>::pop() { if(s2.empty()) { while(!s1.empty()) { T &t=s1.top(); s2.push(t); s1.pop(); } } if(s2.empty()) { logic_error ex("queue is empty"); throw exception(ex); } cout<<s2.top()<<endl; s2.pop(); } int main() { Q<int> q; int a[] ={1,2,3,4,5,6}; q.push(a,sizeof(a)/sizeof(a[0])); q.pop(); return 0; }