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

课后作业

问题描述

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

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

实现 MyStack 类:

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

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is 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
  • 最多调用100 次 push、pop、top 和 empty
  • 每次调用 pop 和 top 都保证栈不为空

代码实现

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();

发表回复

后才能评论

评论(3)

  • Yuki 永久会员 2024年2月1日 上午11:11

    打卡
    class MyStack {
    public:
    queueque;//用一个队列模拟栈

    MyStack() {
    
    }
    
    void push(int x) {
        que.push(x);
    }
    
    int pop() {
    /*除了最后一个元素都弹出重新从后面加入,
    剩下的最后一个就是要弹出的*/
        int size=que.size();
        size--;
        while(size--){
            que.push(que.front());
            que.pop();
        }
        int res=que.front();
        que.pop();
        return res;
    }
    
    int top() {
        return que.back();
    }
    
    bool empty() {
        return que.empty();
    }
    

    };

    /*
    queue的front和back返回的都是引用,真正弹出元素只能用pop
    */

  • uu 永久会员 2023年9月23日 下午4:04
    // 【思路】一个队列
    // 时间复杂度:除了入栈是O(n),其余操作是O(1)
    // 空间复杂度:O(n)
    class MyStack {
        Queue<Integer> queue;
    
        public MyStack() {
            queue = new LinkedList();
        }
    
        public void push(int x) {
            queue.offer(x);
            for(int i = 0; i < queue.size() - 1; i++) {
                queue.offer(queue.poll());
            }
        }
    
        public int pop() {
            return queue.poll();
        }
    
        public int top() {
            return queue.peek();
        }
    
        public boolean empty() {
            return queue.isEmpty();
        }
    }
    
    // 【思路】两个队列
    // 时间复杂度:除了入栈是O(n),其余操作是O(1)
    // 空间复杂度:O(n)
    // class MyStack {
    //     Queue<Integer> queue1;
    //     Queue<Integer> queue2;
    
    //     public MyStack() {
    //         queue1 = new LinkedList();
    //         queue2 = new LinkedList();
    //     }
    
    //     public void push(int x) {
    //         //队列1接受新入栈的元素
    //         queue1.offer(x);
    //         while(!queue2.isEmpty()) {
    //             queue1.offer(queue2.poll());
    //         }
    //         //交换队列,使得队列1始终为空
    //         Queue 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();
     */
    
  • 帅气的冬瓜 普通 2023年6月30日 上午10:33

    打卡

如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理