两个栈实现队列+两个队列实现栈----C++
2015-03-10 21:38
288 查看
1. 两个栈实现队列
思路: 我们先想象下队列有哪些功能?进队列(push)、出队列(pop)、队首元素(front)、队尾元素(back)。
这里使用了两个栈stack1和stack2。进队列(push),直接进stack1。出队列(pop),若stack2非空,我们需要的恰好在栈顶,出栈;若stack2空,则所有stack1元素,并入stack2,再出栈。队首和队尾元素恰好就在两个栈的top位置。
代码:
2. 两个队列实现栈
思路:
所有元素a b c进入q1,因为我们的目的是栈,也就是最先出c,儿队是从队头开始出,所有先把a b 出q1并入q2,此时目标c 跑到了队头,出q1。此时q1已经为空,下一个要出的是b,把a从q2出队并进q1,此时目标b在q2队头,出队........
即:把非空队列的n-1个压人空对列,剩的第n个出队...即总有一个队列为空。
代码:
思路: 我们先想象下队列有哪些功能?进队列(push)、出队列(pop)、队首元素(front)、队尾元素(back)。
这里使用了两个栈stack1和stack2。进队列(push),直接进stack1。出队列(pop),若stack2非空,我们需要的恰好在栈顶,出栈;若stack2空,则所有stack1元素,并入stack2,再出栈。队首和队尾元素恰好就在两个栈的top位置。
代码:
#include<iostream> #include<stack> using namespace std; template<class T> class NQueue { public: void push(const T&t) { s1.push(t); } void pop() { if(qSize()!=0) { if(s2.empty()) { s1Tos2(); } s2.pop(); } else { cout<<"队列已为空"<<endl; } } T& front() { if(s2.empty()) { s1Tos2(); } return s2.top(); } T& back() { return s1.top(); } void s1Tos2() { while(!s1.empty()) { s2.push(s1.top()); s1.pop(); } } int qSize() { return s1.size()+s2.size(); } private: stack<T> s1; stack<T> s2; }; int main() { NQueue<int> mq; int i; for(i=0;i<10;++i) { mq.push(i); } cout<<"back value is :"<<mq.back()<<endl; cout<<"front value is :"<<mq.front()<<endl; cout<<"size value is :"<<mq.qSize()<<endl; for(i=0;i<10;++i) { cout<<mq.front()<<" "; mq.pop(); } cout<<endl; return 0; }
2. 两个队列实现栈
思路:
所有元素a b c进入q1,因为我们的目的是栈,也就是最先出c,儿队是从队头开始出,所有先把a b 出q1并入q2,此时目标c 跑到了队头,出q1。此时q1已经为空,下一个要出的是b,把a从q2出队并进q1,此时目标b在q2队头,出队........
即:把非空队列的n-1个压人空对列,剩的第n个出队...即总有一个队列为空。
代码:
#include<iostream> #include<queue> using namespace std; template<class T> class NStack { public: void push(const T&t) { q1.push(t); } void pop() { if(sSize!=0) { if(!q1.empty()) { putN_1ToAnother(); q1.pop(); } else { putN_1ToAnother(); q2.pop(); } } else { cout<<"栈已为空"<<endl; } } T& top() { if(!q1.empty()) { return q1.back(); } else { return q2.back(); } } void putN_1ToAnother() { if(!q1.empty()) { while(q1.size()>1) { q2.push(q1.front()); q1.pop(); } } else if(!q2.empty()) { while(q2.size()>1) { q1.push(q2.front()); q2.pop(); } } } int sSize() { return q1.size()+q2.size(); } private: queue<T> q1; queue<T> q2; }; int main() { NStack<int> mq; int i; for(i=0;i<10;++i) { mq.push(i); } cout<<"top value is :"<<mq.top()<<endl; cout<<"size value is :"<<mq.sSize()<<endl; for(i=0;i<10;++i) { mq.pop(); } cout<<endl; return 0; }
相关文章推荐
- 用两个栈实现一个队列的功能,请用C++实现它
- C++两个队列实现一个栈
- 【C++】两个队列实现一个栈
- 《剑指offer》:[7]两个队列实现栈的C++代码实现
- 两个栈来实现一个队列的C++代码
- C++ 用两个栈实现一个队列
- 剑指offer两个栈实现队列的c++写法(九度1512)
- 【C++】两个栈实现一个队列
- C++两个栈实现队列
- C++面试题:两个队列实现一个栈
- C/C++之用两个栈实现一个队列的功能
- 程序员面试题精选(48):两个堆栈模拟队列c++代码实现
- C++:利用两个栈实现队列操作
- 利用两个栈实现一个队列(C++版)
- c++ 两个栈实现队列
- 两个栈实现一个队列——C++ 利用STL 栈stack实现
- 用两个栈实现一个队列,用两个队列实现一个栈,C++ STL版
- C++两个队列实现一个栈
- C++两个栈实现一个队列和两个队列实现一个栈
- 两个栈实现队列C++代码