剑指Offer:面试题7 用两个栈实现队列
2014-09-06 01:07
579 查看
/* 用两个队列实现一个栈: 通过栈的操作分析队列模拟栈的过程。 先往栈内压入一个元素a,把a压入queue1,接下来继续往栈内压入b、c两个元素,把他们都插入到queue1:{a,b,c}, 从栈内弹出一个元素: 应该将c弹出,但c在尾部,先在queue1中删除元素a,b,并插入到queue2中,再从queue1中删除元素c。 说白了,两个队列互相利用,除最后一个元素以外的其余元素全部放到另一个队列,删除另一个队列中最后一个元素 。 往栈内压入元素d到queue1的尾部,再弹出一个元素,这时被弹出的应该是d,先从头部删除queue1的元素并插入到 queue2中,知道在queue1中遇到d再直接把它删除。 输入: abcdx 输出: dcba */ /* 关键: 1 if(!queue1.empty() && queue2.empty())//当1个队列为空,令一个队列不空时,就把除最后一个元素的其余元素压入到另一个队列中 { while(queue1.size() > 1)//确保queue1中至少有两个元素 2 */ #include <queue> #include <stdio.h> #include <stdlib.h> using namespace std; template<typename T> class CStack { public: CStack(){} virtual ~CStack(){} void push(const T& element); T pop(); bool empty() { if(queue1.empty() && queue2.empty()) { return true; } else { return false; } } private: queue<T> queue1; queue<T> queue2; }; template<typename T> void CStack<T>::push(const T& element) { if(!queue2.empty())//压入哪个队列,压入的队列应该是不空的队列,如果两个队列同时为空,就压入到queue1中 { queue2.push(element); } else//其余情况包括queue2为空和queue1不管为不为空的情形 { queue1.push(element); } } template<typename T> T CStack<T>::pop() { if(!queue1.empty() && queue2.empty())//当1个队列为空,令一个队列不空时,就把除最后一个元素的其余元素压入到另一个队列中 { while(queue1.size() > 1)//确保queue1中至少有两个元素 { queue2.push(queue1.front()); queue1.pop(); } T& ele = queue1.front();//将queue1中剩余的一个元素弹出即可 queue1.pop(); return ele; } else if(queue1.empty() && !queue2.empty())//当1个队列为空,令一个队列不空时,就把除最后一个元素的其余元素压入到另一个队列中 { while(queue2.size() > 1)//确保queue1中至少有两个元素 { queue1.push(queue2.front()); queue2.pop(); } T& ele = queue2.front();//将queue1中剩余的一个元素弹出即可 queue2.pop(); return ele; } //如果两个队列均为空,抛出异常 if(queue1.empty() && queue2.empty()) { throw new exception("Stack is empty!"); } } void process() { CStack<char> cstack; char ch; while(EOF != scanf("%c",&ch)) { if(ch == 'x') { break; } cstack.push(ch); } while(!cstack.empty()) { printf("%c",cstack.pop()); } } int main(int argc,char* argv[]) { process(); getchar(); system("pause"); return 0; }
相关文章推荐
- 【剑指offer】面试题7:用两个栈实现队列
- 剑指offer之面试题7用两个栈实现一个队列
- 剑指offer--面试题7:用两个栈实现队列--Java实现
- 剑指Offer----面试题七:用两个栈实现队列
- 【剑指offer 面试题7】用两个栈实现队列
- 剑指offer之面试题7:用两个栈实现队列
- 剑指Offer面试题7用两个栈实现队列
- 剑指Offer面试题7:用两个栈实现队列 Java实现
- 剑指offer--面试题7: 用两个栈实现队列
- 剑指offer面试题7:用两个栈实现队列
- 剑指offer_面试题7_用两个栈实现队列(让我熟悉了类模板的使用)
- 剑指offer 面试题7 两个栈实现队列
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- 剑指offer面试题java实现之题7:用两个栈模拟一个队列的入队和出队操作
- 【剑指offer】面试题7:用两个栈实现队列
- 剑指offer面试题7——用两个栈实现队列
- 【剑指offer】2.3.5栈和队列——面试题7:用两个栈实现队列
- 【剑指offer】面试题七:用两个栈实现队列
- [剑指offer][面试题07-扩展]用两个队列实现栈
- [剑指offer][面试题07]用两个栈实现队列