题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appenTail和deleteHead,分别完成在队列尾部插入结点和队列头部删除结点的功能。
解法:因为栈是后入先出,而队列是先入先出。即出栈的顺序是和入栈的顺序颠倒的,由负负得正很容易想到两个栈可以实现按原先的顺序输出。
算法设计:(1)入队的时候总是插入stack1的尾部;
(2)出队的时候,如果stack2不为空,直接出栈,因为stack2中若有元素,它的栈顶元素是最先进入队列的元素,直接弹出;如果stack2为空,stack1的所有元素出栈,插入stack2,直到stack1为空。先进入的元素压在stack1的底端,从stack1出栈就出现在stack2的顶端了。
#include <iostream> #include <stack> using namespace std; template <typename T> class CQueue { public: // CQueue(void); // ~CQueue(void); void appendTail(const T& node); T deleteHead(); void printQueue(); int size(); private: stack<T> stack1; stack<T> stack2; int len; }; template<typename T> void CQueue<T>::appendTail(const T& element) { stack1.push(element); len++; } template<typename T> T CQueue<T>::deleteHead() { if(stack2.size() <= 0) { while(stack1.size() > 0) { T& data = stack1.top(); stack1.pop(); stack2.push(data); } } if(stack2.size() == 0) cout << "queue is empty" << endl; T head = stack2.top(); stack2.pop(); return head; } template<typename T> int CQueue<T>::size() { return len; } template<typename T> void CQueue<T>::printQueue() { for(int i = 0; i < size(); ++i) cout << deleteHead() << " "; cout << endl; } int main() { // your code goes here CQueue<int> Q; for(int i=1; i<10; ++i) Q.appendTail(i); Q.printQueue(); return 0; }引申:用两个队列实现一个栈
解法:如果输入a,b,c,d,e,出栈的时候先输出a,那么可以将b,c,d,e已到queue2中,这时候queue1中只剩下a,直接出队。再出栈的时候只要把c,d,e再移到queue1中就可以了,这时候queue2只剩下b,依次类推。保证两个队列总有一个为空,插入的时候选择非空的队列插入。
#include <iostream> #include <queue> using namespace std; template <typename T> class MyStack { public: T pop(); void push(const T& node); MyStack(); bool empty(); private: queue<T> queue1; queue<T> queue2; }; template <typename T> MyStack<T>::MyStack() { while(!queue1.empty()) queue1.pop(); while(!queue2.empty()) queue2.pop(); } template <typename T> void MyStack<T>::push(const T& node) { if(queue1.empty() && !queue2.empty()) queue2.push(node); else queue1.push(node); } template <typename T> T MyStack<T>::pop() { T tmp; if(!queue1.empty() && queue2.empty()) { while(queue1.size() > 1) { queue2.push(queue1.front()); queue1.pop(); } tmp = queue1.front(); queue1.pop(); } else if(queue1.empty() && !queue2.empty()) { while(queue2.size() > 1) { queue1.push(queue2.front()); queue2.pop(); } tmp = queue2.front(); queue2.pop(); } else cout << "stack is wrong" << endl; return tmp; } template <typename T> bool MyStack<T>::empty() { if(queue1.empty() && queue2.empty()) return true; return false; } int main() { // your code goes here MyStack<int> s; for(int i = 1; i < 10; ++i) s.push(i); while(!s.empty()) cout << s.pop() << " "; cout << endl; return 0; }