如何用两个栈(队列)实现一个队列(栈)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44759710/article/details/100422805

用两个栈实现一个队列,这是一道很经典的面试题…emmm…然而怎么解决呢
首先明确解题思路:
队列的特性是:“先入先出”,栈的特性是:“先入后出”
1)建立两个栈A、B

  • 栈A用来入队列
  • 栈B用来出队列

2)入队出队操作
入队:将元素进栈A
出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈, 如果不为空,栈B直接出栈

class Solution
{
public:
    void push(int node)
	{
        stack1.push(node);
    }
 
    int pop() 
	{
        if(stack2.empty())
        {
        	//将stack1中元素弹出压入到stack2中
            while(!stack1.empty())
            {
                stack2.push(stack1.top());
				//将stack2栈顶弹出即为队列的队头元素
                stack1.pop();
            }
        }
        else//如果stack2不为空,则直接弹出栈顶元素即为队头元素
        {
            res = stack2.top();
            stack2.pop();
            return res;
        }
    }
private:
    stack<int> stack1;
    stack<int> stack2;
    int res;
};

以上代码我们可以通过举例来说明:
插入数 a,b,c,d入队列,此时的栈情况为:

  • 栈 stack1:{a,b,c,d}
  • 栈 stack2:{ }

弹出a,a在stack1的最下面,将stack1中全部元素逐个弹出压入stack2,从stack2中弹出a,此时的栈情况为:

  • 栈 stack1:{ }
  • 栈 stack2:{d,c,b}

继续弹出b ,b比 c 先进入,b在stack2的栈顶,可直接弹出,此时的栈情况为:

  • 栈 stack1:{ }
  • 栈 stack2:{d,c}

同样的,可依次将c,d从栈stack2中弹出即可

从该题同样可以引申出“如何用两个队列实现栈”,解题思路如下:
1)建立两个队列A、B

  • 栈A用来入栈
  • 栈B用来出栈

2)入栈出栈操作
入栈:将元素进队列A
出栈:判断队列A中元素的个数是否为1,如果等于1,则出队列,否则将队列A中的元素 以此出队列并放入队列B,直到队列A中的元素留下一个,然后队列A出队列,再把队列B中的元素出队列以此放入队列A中

猜你喜欢

转载自blog.csdn.net/qq_44759710/article/details/100422805
今日推荐