题目描述
用两个栈来实现一个队列,完成队列的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;
};