利用两个栈实现队列
2016-04-21 18:34
295 查看
方法一:
入队时,将元素压入s1。出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒回”s1。
方法二:入队时,先判断s1是否为空,如不为空,说明所有元素都在s1,此时将入队元素直接压入s1;如为空,要将s2的元素逐个“倒回”s1,再压入入队元素。出队时,先判断s2是否为空,如不为空,直接弹出s2的顶元素并出队;如为空,将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。
最优解:
入队时,将元素压入s1。出队时,判断s2是否为空,如不为空,则直接弹出顶元素;如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。
注意:考虑没有元素可供出队时的处理(2个栈都为空的时候,出队操作一定会引起异常)
代码实现
参考:《剑指offer》面试题7 http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html
入队时,将元素压入s1。出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒回”s1。
方法二:入队时,先判断s1是否为空,如不为空,说明所有元素都在s1,此时将入队元素直接压入s1;如为空,要将s2的元素逐个“倒回”s1,再压入入队元素。出队时,先判断s2是否为空,如不为空,直接弹出s2的顶元素并出队;如为空,将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。
最优解:
入队时,将元素压入s1。出队时,判断s2是否为空,如不为空,则直接弹出顶元素;如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。
注意:考虑没有元素可供出队时的处理(2个栈都为空的时候,出队操作一定会引起异常)
代码实现
//test1.h #include<iostream> #include<stack> using namespace std; template<class T> class queueWithTwoStack { public: queueWithTwoStack(); ~queueWithTwoStack(); void addTail(const T& data); T deleteHead(); private: stack<T> s1; stack<T> s2; }; //test1.cpp #include "test1.h" using namespace std; template<class T> queueWithTwoStack<T>::queueWithTwoStack() {} template<class T> queueWithTwoStack<T>::~queueWithTwoStack() {} //加只加在S1中 template<class T> void queueWithTwoStack<T>::addTail(const T& data) { s1.push(data); } //删只删S2中的 template<class T> T queueWithTwoStack<T>::deleteHead() { if((s2.empty())&&(s1.empty())) { printf("is empty!\n"); return -1; } //s2为空,把S1全倒在S2中后删 if(s2.empty()) { while(!s1.empty()) { T top=s1.top(); s1.pop(); s2.push(top); } } //s2不为空直接删 T head=s2.top(); s2.pop(); return head; } void test1() { queueWithTwoStack<int> qw; qw.addTail(1); qw.addTail(2); qw.addTail(3); cout<<qw.deleteHead()<<endl; cout<<qw.deleteHead()<<endl; cout<<qw.deleteHead()<<endl; //cout<<qw.deleteHead()<<endl; } void test2() { queueWithTwoStack<int> qw; qw.addTail(1); qw.addTail(2); qw.addTail(3); cout<<qw.deleteHead()<<endl; qw.addTail(4); cout<<qw.deleteHead()<<endl; cout<<qw.deleteHead()<<endl; cout<<qw.deleteHead()<<endl; } int main() { //test1(); test2(); system("pause"); return 0; }
参考:《剑指offer》面试题7 http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html
相关文章推荐
- C#实现将数组内元素打乱顺序的方法
- jQuery删除一个元素后淡出效果展示删除过程的方法
- C#线程队列用法实例分析
- jQuery拖动元素并对元素进行重新排序
- 算法系列15天速成 第九天 队列
- C语言单链队列的表示与实现实例详解
- Perl中怎样从数组中删除某个值?
- mysql 队列 实现并发读
- PHP的数组中提高元素查找与元素去重的效率的技巧解析
- C#队列Queue用法实例分析
- C#多线程处理多个队列数据的方法
- javascript学习笔记(十八) 获得页面中的元素代码
- javascript实现在某个元素上阻止鼠标右键事件的方法和实例
- C语言循环队列的表示与实现实例详解
- C++循环队列实现模型
- C#内置队列类Queue用法实例
- jQuery验证元素是否为空的两种常用方法
- Array栈方法和队列方法的特点说明
- JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
- jQuery on()绑定动态元素出现的问题小结