LeetCode225. 用队列实现栈🌟🌟🌟🌟🌟简单

课后作业

问题描述

原文链接:225. 用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppopempty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsizeis empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例:

输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]

解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

提示:

  • 1 <= x <= 9
  • 最多调用100pushpoptopempty
  • 每次调用 poptop 都保证栈不为空

代码实现

Java

class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;

    public MyStack() {
        queue1 = new LinkedList();
        queue2 = new LinkedList();
    }

    public void push(int x) {
        //永远让queue1为空
        queue1.offer(x);
        while(!queue2.isEmpty()){
            queue1.offer(queue2.poll());
        }

        // 交换队列1和队列2
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }

    public int pop() {
        return queue2.poll();
    }

    public int top() {
        return queue2.peek();
    }

    public boolean empty() {
        return queue2.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

Python

from collections import deque

class MyStack(object):

    def __init__(self):
        self.queue1 = deque()
        self.queue2 = deque()


    def push(self, x):
        """
        :type x: int
        :rtype: None
        """
        # 永远让 queue1 为空
        self.queue1.append(x)
        while len(self.queue2) > 0:
            self.queue1.append(self.queue2.popleft())

        # 交换队列1和队列2
        self.queue1, self.queue2 = self.queue2, self.queue1


    def pop(self):
        """
        :rtype: int
        """
        return self.queue2.popleft()


    def top(self):
        """
        :rtype: int
        """
        return self.queue2[0]


    def empty(self):
        """
        :rtype: bool
        """
        return len(self.queue2) == 0

# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

C++

class MyStack {
private:
    queue<int> queue1;
    queue<int> queue2;
public:
    MyStack() {

    }

    void push(int x) {
        //永远让queue1为空
        queue1.push(x);
        while (!queue2.empty()) {
            queue1.push(queue2.front());
            queue2.pop();
        }

        // 交换队列1和队列2
        swap(queue1, queue2);
    }

    int pop() {
        int top = queue2.front();
        queue2.pop();
        return top;
    }

    int top() {
        return queue2.front();
    }

    bool empty() {
        return queue2.empty();
    }
};

// Your MyStack object will be instantiated and called as such:
// MyStack* obj = new MyStack();
// obj->push(x);
// int param_2 = obj->pop();
// int param_3 = obj->top();
// bool param_4 = obj->empty();

Go

type MyStack struct {
    queue1 []int
    queue2 []int
}

func Constructor() MyStack {
    return MyStack{make([]int,0), make([]int,0)}
}

func (this *MyStack) Push(x int) {
    //永远让queue1为空
    this.queue1 = append(this.queue1, x)
    for len(this.queue2) > 0 {
        this.queue1 = append(this.queue1, this.queue2[0])
        this.queue2 = this.queue2[1:]
    }

    // 交换队列1和队列2
    this.queue1, this.queue2 = this.queue2, this.queue1
}

func (this *MyStack) Pop() int {
    top := this.queue2[0]
    this.queue2 = this.queue2[1:]
    return top
}

func (this *MyStack) Top() int {
    return this.queue2[0]
}

func (this *MyStack) Empty() bool {
    return len(this.queue2) == 0
}

// Your MyStack object will be instantiated and called as such:
// obj := Constructor();
// obj.Push(x);
// param_2 := obj.Pop();
// param_3 := obj.Top();
// param_4 := obj.Empty();

发表评论

后才能评论