剑指Offer 题目7: 两个栈实现队列
Queue.h
#ifndef QUEUE_H #define QUEUE_H #include <stack> template <class T> class CQueue { public: CQueue(void){}; ~CQueue(void){}; void appendTail(const T &element); T deleteHead(); private: stack<T> stack1; stack<T> stack2; }; #endif
#include<iostream> using namespace std; #include "Queue.h" /* template<class T> CQueue<T>::CQueue() { } template<class T> CQueue<T>::~CQueue() { } */ template <class T> void CQueue<T>::appendTail(const T &element) { //入队时,直接压入stack1的栈顶 stack1.push(element); } template <class T> T CQueue<T>::deleteHead() { /* 出队时, 若stack2为空,则将stack1的元素弹出并压入到stack2中. 若stack2不为空,则直接弹出stack2的栈顶元素. */ if (stack2.size() <= 0) { while (stack1.size() > 0) { T &data = stack1.top(); stack1.pop(); stack2.push(data); } } if (stack2.size() == 0) { throw new exception("queue is empty!"); } T head = stack2.top(); stack2.pop(); return head; }
/* 使用两个栈实现队列的功能 */ #include <iostream> #include "Queue.cpp" using namespace std; int main(void) { CQueue<char> q; //入队 q.appendTail('a'); q.appendTail('b'); q.appendTail('c'); //出队 cout<<q.deleteHead()<<endl; return 0; }
两队列实现栈:
/* 使用两个队列实现栈的功能 */ #include <iostream> #include <queue> using namespace std; queue<char> queue1; queue<char> queue2; /* 入栈,两个队列只存在两种情况. 第一种: 两个队列都为空 第二种: 一个为空,另一个不为空. */ void myPush(const char &c) { //若两个队列都为空,则在queue1中入队 if (queue1.size() == 0 && queue2.size() == 0) { queue1.push(c); } //若queue1不为空(即queue2为空),则queue1可直接入队 else if (queue1.size() != 0) { queue1.push(c); } //若queue2不为空(即queue1为空),则queue2可直接入队 else if (queue2.size() != 0) { queue2.push(c); } } //出栈 char myPop() { if (queue1.size()==0 && queue2.size()==0) { throw new exception("stack is empty!"); } else if (queue1.size() != 0) { //将queue1队尾元素除外的元素出队,并压入queue2中 while (queue1.size() >1) { char s = queue1.front(); queue1.pop(); queue2.push(s); } //将队尾元素弹出 char cs = queue1.front(); queue1.pop(); return cs; } else if (queue2.size() != 0) { //将queue2队尾元素除外的元素出队,并压入queue1中 while (queue2.size() >1) { char s = queue2.front(); queue2.pop(); queue1.push(s); } //将队尾元素弹出 char cs = queue2.front(); queue2.pop(); return cs; } } int main(void) { //入栈 myPush('a'); myPush('b'); myPush('c'); //出栈 cout << myPop() <<endl; cout << myPop() << endl; myPush('d'); cout << myPop() << endl; return 0; }