一道编程题——两个栈实现队列

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

题目分析

栈的特点是先进后出,队列为先进先出。

队列的功能只有2个,队尾进,队首出。

队尾进:这一功能和栈一致。

队首出:队列中第一个出队元素,在栈中为栈底元素。在栈中,要想取到栈底元素,必须所有元素出栈。而这些元素,只需要输出最后一个,其他的仍然需要保存。所以,我们可以把一个栈的元素依次取出,存入另一个栈。

解题思路

两个栈A,B,A用来接收入队的元素,B用来模拟出队的操作。

入队时,元素压入栈A,出队时,从栈B的栈顶弹出,如果B中没有元素,则依次取出A的元素压入栈B,再模拟出队操作。

比如:栈A = [1,2,3,4],栈B = [ ]。

模拟入队操作时,元素直接压入栈A。

模拟出队操作,则需要取出第一个元素1,这时,需要把栈A中元素转到栈B。

栈A = [ ],栈B = [ 4, 3, 2, 1]。然后再取出栈B的最后一个元素1。

下一次出队操作,再次从栈B取出栈顶元素。如果栈B为空,则将栈A所有的元素取出,压入栈B,再执行栈B的弹出栈顶操作。

代码

python实现

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.stack_a = []
        self.stack_b = []
    def push(self, node):
        # write code here
        self.stack_a.append(node)
    def pop(self):
        # return xx
        if self.stack_b == []:
            if self.stack_a == []:return
            self.stack_b = list(reversed(self.stack_a))
            self.stack_a = []
            return self.stack_b.pop()
        else:
            return self.stack_b.pop()

C++实现

class Solution
{
public:
    void push(int node) {
        stack2.push(node);
    }
    
    int pop() {
        if(stack1.empty()){
            while(!stack2.empty()){
                stack1.push(stack2.top());
                stack2.pop();
            }
        }
        int tmp = stack1.top();
        stack1.pop();
        return tmp;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

  上一篇
Vue初见——如何运行一个Vue项目 Vue初见——如何运行一个Vue项目
一开始刚接手项目内的vue.js,或者在GitHub上找到vue.js的开源项目,会发现不知如何运行这个项目。通过查阅网上教程,成功搭建好项目环境,同时对前段工程化有了朦朦胧胧的认知,因此将环境搭建过程分享给大家。
2019-03-16
下一篇 
一道编程题——重建二叉树 一道编程题——重建二叉树
编程题:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
2019-03-03
   目录