【面试题】剑指offer07--两个栈实现一个队列

来源:互联网 发布:cmd删除windows.old 编辑:程序博客网 时间:2024/06/05 20:13

我们都知道,栈的顺序是现金后出,而队列的顺序是后进先出,用两个栈实现一个队列,算法的思路如下:

现有两个队列q1与q2,入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 ;现在要出栈,后进先出那么4要出栈。但是q1是一个

队列,先进先出,那么 1 2 3出队列 q2 1 2 3 入队列,q1中此时剩余4,把4出对列达到出栈的效果。  这个时候如果我们又加入一个元素5,那么我们应该把5放到

q1还是q2,因为现在q2中有 1 2 3,把5放到q1不方便统计,所以要把5放入到q2;如果5放到了q1,等下编写出栈的代码很麻烦,如果放到q2我们只需要分类:q2

是不是为空,为空的为一种情况,不为空的为一种情况:

所以最后:

如果q1与q2都为空,那么往q1中插入元素

如果q1不为空,那么往q1中插入元素

如果q2不为空,那么往q1中插入元素

代码实现:

#include<iostream>using namespace std;#include<assert.h>#include<stack>template<typename T>class Queue{public:void Push(const T& x){sin.push(x);}void Pop(){assert(!sin.empty() || sout.empty());if (sout.empty())//如果出栈的数字为空{while (!sin.empty())//当入栈的数字不为空的时候{sout.push(sin.top());//入栈里面的最上面数字拿出来放到出栈里面sin.pop();//入栈最上面的数字pop掉}}sout.pop();//当出栈的数字不为空时,将出栈里面的数字进行pop}const T& Front(){assert(!sin.empty() || !sout.empty());if (sout.empty()){while (!sin.empty()){sout.push(sin.top());sin.pop();}}return sout.top();}protected:stack<T> sin;//定义入栈stack<T> sout;//定义出栈};int main(){system("pause");return 0;}


原创粉丝点击