共以下 60 个回答

  • 糖香香 普通 2023年6月29日 下午7:59
        class MyStack {
            //进队列
            ArrayDeque<Integer> deque1;
    
            //出队列
            ArrayDeque<Integer> deque2;
    
            public MyStack() {
                deque1 = new ArrayDeque<>();
                deque2 = new ArrayDeque<>();
            }
    
            public void push(int x) {
                deque1.addLast(x);
            }
    
            public int pop() {
                if (!deque1.isEmpty()){
                    return deque1.pollLast();
                } else {
                    while (!deque1.isEmpty()){
                        deque2.addLast(deque1.pollFirst());
                    }
                    if (deque2.isEmpty()) {
                        return -1;
                    } else {
                        return deque2.pollLast();
                    }
                }
            }
    
            public int top() {
                if (!deque1.isEmpty()){
                    return deque1.peekLast();
                } else {
                    return deque2.peekLast();
                }
    
            }
    
            public boolean empty() {
                if (deque1.isEmpty()&&deque2.isEmpty()){
                    return true;
                } else {
                    return false;
                }
            }
        }
    
    0 赞同 0 条回复
  • lucca 普通 2022年12月31日 下午5:31
    • a、b两个队列
    • 只让 a 存数据
    • b 只在每次 top 和 pop 的时候辅助
    • 将a前n-1个数组加入b,然后获取top值,再根据top和pop的操作进行具体的操作,最后交换两个队列,b成为新的a
    class MyStack {
    
        Queue<Integer> a = new LinkedList<>(), b = new LinkedList<>();
    
        public MyStack() {}
    
        public void push(int x) {
            a.offer(x);
        }
    
        public int pop() {
            while (a.size() > 1) b.offer(a.poll());
            int ans = a.poll();
            Queue<Integer> t = b; b = a; a = t;
            return ans;
        }
    
        public int top() {
            while (a.size() > 1) b.offer(a.poll());
            int ans = a.poll();
            b.offer(ans);
            Queue<Integer> t = b; b = a; a = t;
            return ans;
        }
    
        public boolean empty() {
            return a.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();
     */
    
    0 赞同 0 条回复
  • 努力刷题 普通 2022年11月30日 上午6:16
    用了一个队列实现
    class MyStack(object):
    
        def __init__(self):
            self.que = deque()
    
        def push(self, x):
            """
            :type x: int
            :rtype: None
            """
            self.que.append(x)
            for _ in range(len(self.que)-1):
                self.que.append(self.que.popleft())
    
        def pop(self):
            """
            :rtype: int
            """
            return self.que.popleft()
    
    
        def top(self):
            """
            :rtype: int
            """
            return self.que[0]
    
    
        def empty(self):
            """
            :rtype: bool
            """
            if self.que:
                return False
            return True
    
    0 赞同 0 条回复
  • PatNick 普通 2022年11月20日 下午2:25
    class MyStack:
    
        def __init__(self):
            self.main_list = []
            self.help_list = []
    
        def push(self, x: int) -> None:
            '''
            元素压入栈顶
            Args:
                x:
    
            Returns:
    
            '''
            # 入栈先入辅助队列
            self.help_list.append(x)
            # 因为栈是后入先出的,最先入栈的需要放在主队列的最前面才能保证出栈时是出的最后入栈的值
            # 所以将主队列中的值放到最新入栈的(辅助队列)后面
            self.help_list.extend(self.main_list)
    
            # 将辅助队列赋给主队列的值
            # 辅助队列清零
            self.main_list = self.help_list
            self.help_list = []
    
    
    
        def pop(self) -> int:
            '''
            移除并返回栈顶元素
            Returns:
    
            '''
            return self.main_list.pop(0)
    
    
        def top(self) -> int:
            '''
            返回栈顶元素
            Returns:
    
            '''
            return self.list1[0]
    
        def empty(self) -> bool:
            '''
            如果栈是空的,返回true,否则返回false
            Returns:
    
            '''
            if self.main_list:
                return False
            else:
                return True
    
    0 赞同 0 条回复
  • 如梦似歌 普通 2022年11月10日 下午4:27
    class MyStack {
    
        //定义两个队列,其中queue_1用于存储栈内的元素,queue_2作为入栈操作的辅助队列
        Queue<Integer> queue_1;
        Queue<Integer> queue_2;
    
        public MyStack() {
            queue_1 = new LinkedList<Integer>();
            queue_2 = new LinkedList<Integer>();
        }
    
        public void push(int x) {
            //首先将元素加入到队列queue_2
            queue_2.add(x);
            //然后将queue_1的元素一次出队并入队到queue_2; 此时queue_2的前端元素即为新入栈的元素
            while(!queue_1.isEmpty()){
                queue_2.add(queue_1.poll());
            }
            //定义一个辅助队列,将queue_1和queue_2进行交换,交换后queue_1的元素即为栈内的元素,queue_1的前端后后端分别对应栈顶和栈底
            Queue<Integer> temp = queue_1;
            queue_1 = queue_2;
            queue_2 = temp;
    
    //        //使用一个队列实现栈时
    //        //入栈操作时,首先获得入栈前的元素个数 nn,然后将元素入队到队列
    //        int n = queue_1.size();
    //        queue_1.add(x);
    //        //再将队列中的前 nn 个元素(即除了新入栈的元素之外的全部元素)依次出队并入队到队列,此时队列的前端的元素即为新入栈的元素,且队列的前端和后端分别对应栈顶和栈底。
    //        for (int i = 0; i < n; i++) {
    //            queue_1.add(queue_1.poll());
    //        }
        }
    
        //由于每次入栈操作都确保queue_1的前端元素为栈顶元素,因此出栈只需要移除queue_1的前端元素并返回即可
        public int pop() {
            return queue_1.poll();
        }
    
        //由于每次入栈操作都确保queue_1的前端元素为栈顶元素,因此只需要获得queue的前端元素并返回即可(不移除元素)
        public int top() {
            return queue_1.peek();
        }
    
        //由于queue_1用于存储栈内的元素,判断栈是否为空时,只需要判断queue_1是否为空即可
        public boolean empty() {
            return queue_1.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 🚲南下 普通 2022年11月10日 上午9:57
    class MyStack {
    public:
        MyStack() {
    
        }//用一个队列实现栈,主要是出栈
    
        queue<int> que;
    
        void push(int x) { 
            que.push(x);
        }
    
        int pop() { //需要将队列中最后一个元素前面的元素都移动到它前面
            int size = que.size();
            size--;
            while(size--){ //移动除了最后一个元素的其它元素
                que.push(que.front());
                que.pop();
            }
            int result = que.front();
            que.pop();
            return result;
    
        }
    
        int top() {
            return que.back(); //返回最后一个元素
        }
    
        bool empty() {
           return que.empty();
        }
    };
    
    0 赞同 0 条回复
  • xye 普通 2022年11月2日 上午11:45

    一个队列实现栈

    type MyStack struct {
        queue []int
    }
    
    
    func Constructor() MyStack {
        return MyStack{}
    }
    
    
    func (this *MyStack) Push(x int)  {
        n := len(this.queue)
        this.queue = append(this.queue, x)
        for ; n > 0; n-- {
            this.queue = append(this.queue, this.queue[0])
            this.queue = this.queue[1:]
        }
    
    }
    
    
    func (this *MyStack) Pop() int {
        v := this.queue[0]
        this.queue = this.queue[1:]
        return v
    }
    
    
    func (this *MyStack) Top() int {
        return this.queue[0]
    }
    
    
    func (this *MyStack) Empty() bool {
        return len(this.queue) == 0
    }
    
    

    两个队列实现栈

    type MyStack struct {
        queue1, queue2 []int
    }
    
    
    func Constructor() MyStack {
        return MyStack{}
    }
    
    
    func (this *MyStack) Push(x int)  {
        this.queue2 = append(this.queue2, x)
        for len(this.queue1) > 0 {
            this.queue2 = append(this.queue2, this.queue1[0])
            this.queue1 = this.queue1[1:]
        }
        this.queue1, this.queue2 = this.queue2, this.queue1
    }
    
    
    func (this *MyStack) Pop() int {
        v := this.queue1[0]
        this.queue1 = this.queue1[1:]
        return v
    }
    
    
    func (this *MyStack) Top() int {
        return this.queue1[0]
    }
    
    
    func (this *MyStack) Empty() bool {
        return len(this.queue1) == 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();
     */
    
    0 赞同 0 条回复
  • 一只骆驼 普通 2022年11月1日 下午8:55

    两个队列,实现新进的元素在队列头,从而完成后进先出

    class MyStack {
        Deque<Integer> queue1 ;
        Deque<Integer> queue2 ;
    
        public MyStack() {
            queue1 = new ArrayDeque<>();
            queue2 = new ArrayDeque<>();
        }
    
        public void push(int x) {
            queue1.add(x);
            while(!queue2.isEmpty()){
                queue1.offer(queue2.poll());
            }
            Deque temp = queue1;
            queue1 = queue2;
            queue2 = temp;
        }
    
        public int pop() {
            return queue2.poll();
        }
    
        public int top() {
            return queue2.peek();
        }
    
        public boolean empty() {
           return queue2.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • cute. 普通 2022年10月31日 下午9:52
    var MyStack = function() {
        this.queue1 = [];
        // 辅助队列
        this.queue2 = [];
    };
    
    /** 
     * @param {number} x
     * @return {void}
     */
    MyStack.prototype.push = function(x) {
        this.queue1.push(x);
    };
    
    /**
     * @return {number}
     */
    MyStack.prototype.pop = function() {
        // 减少两个队列交换的次数,只有当queue为空时,交换两个队列
        if(!this.queue1.length) {
            [this.queue1, this.queue2] = [this.queue2, this.queue1];
        }
        // 当队列1的元素大于1的时候不断将元素push进备份队列
        while(this.queue1.length > 1) {
            // shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值
            this.queue2.push(this.queue1.shift());
        }
        // 最后将队列1最后一个元素出列
        return this.queue1.shift();
    };
    
    /**
     * @return {number}
     */
    MyStack.prototype.top = function() {
        // 查看栈顶,队列出队,然后在push进队列1
        const x = this.pop();
        this.queue1.push(x);
        return x;
    };
    
    /**
     * @return {boolean}
     */
    MyStack.prototype.empty = function() {
        return !this.queue1.length && !this.queue2.length;
    };
    
    /**
     * Your MyStack object will be instantiated and called as such:
     * var obj = new MyStack()
     * obj.push(x)
     * var param_2 = obj.pop()
     * var param_3 = obj.top()
     * var param_4 = obj.empty()
     */
    
    0 赞同 0 条回复
  • Asphyxia 普通 2022年10月31日 下午8:04

    代码如下

    class MyStack {
    public:
        queue<int> q1;
        queue<int> q2;
        MyStack() {
    
        }
    
        void push(int x) {
            while(!q1.empty()){
                int val = q1.front();
                q1.pop();
                q2.push(val);
            }
            q1.push(x);
            while(!q2.empty()){
                int val = q2.front();
                q2.pop();
                q1.push(val);
            }
        }
    
        int pop() {
            int val = q1.front();
            q1.pop();
            return val;
        }
    
        int top() {
            int val = q1.front();
            return val;
        }
    
        bool empty() {
            if(q1.empty()){
                return true;
            }
            return false;
        }
    };
    
    
    0 赞同 0 条回复
  • 王艺超 普通 2022年10月31日 下午4:41

    利用队列先进先出的特性,每入队一个就交换两个队列就行

    class Solution
    {
    public:
        void push(int element) {
            queue2.push(element);
            while(!queue1.empty())
            {
                queue2.push(queue1.front());
                queue1.pop();
            }
            swap(queue1, queue2);
        }
    
        int pop() {
            if(queue1.empty()) return -1;
            int temp = queue1.front();
            queue1.pop();
            return  temp;
        }
    
        int top() {
           if(queue1.empty()) return -1; 
           return queue1.front();
        }
    
        bool empty() {
            if(queue1.empty()) return true;
            return false;
        }
    
    private:
        queue<int> queue1;
        queue<int> queue2;
    };
    
    0 赞同 0 条回复
  • cxxz 普通 2022年10月30日 下午11:31

    思路和两栈实现队列一样,一个负责正常顺序进队,另一个负责从前面的队尾取后正常顺序压入,这里偷懒了,直接用了一个deque了hh

    class MyStack {
    public:
        deque<int> dq;
        MyStack() {
    
        }
    
        void push(int x) {
            dq.push_back(x);
        }
    
        int pop() {
            if (dq.empty())
                return -1;
            int val = dq.back();
            dq.pop_back();
            return val;
        }
    
        int top() {
            if (dq.empty())
                return -1;
            return dq.back();
        }
    
        bool empty() {
            if (dq.empty())
                return true;
            return false;
        }
    };
    
    0 赞同 0 条回复
  • 阿白 普通 2022年10月29日 下午9:03

    1、初始情况:qStackOut负责将push的值放在其头节点,然后与qStackIn(当前为空)交换,qStackIn的front成为最后push进的值;
    2、循环情况:qStackOut负责将push的值放在其头节点,再将qStackIn的值依次放在其屁股后;结果再放回到qStackIn中,这样保持qStackIn的头始终是最后push的值,尾始终是最先push的值。

    #include <queue>
    class MyStack {
    public:
        MyStack() {
    
        }
    
        void push(int x) {
            qDataOut.push(x);//放在头
            while (!qDataIn.empty())
            {
                qDataOut.push(qDataIn.front());//qDataIn中front放的就是上一次push入的值
                qDataIn.pop();
            }
            std::swap(qDataIn, qDataOut);//交换,使得x放在了qDataIn的front
        }
    
        int pop() {
            int r = qDataIn.front();
            qDataIn.pop();
            return r;
        }
    
        int top() {
            return qDataIn.front();
        }
    
        bool empty() {
            return qDataIn.empty();
        }
    private:
        std::queue<int> qDataIn, qDataOut;
    };
    
    
    0 赞同 0 条回复
  • 云雾里 普通 2022年10月27日 下午11:34
    class MyStack {
        Queue<Integer> queue1;
    
        /** 初始化队列 */
        public MyStack() {
            queue1 = new LinkedList<Integer>();
        }
    
        /** Push元素,并将push之前元素依次poll再offer */
        public void push(int x) {
            int size = queue1.size();
            queue1.offer(x);
            while (size>0) {
                queue1.offer(queue1.poll());
                size--;
            }
        }
    
        /** 弹出第一个元素 */
        public int pop() {
            return queue1.poll();
        }
    
        /** 获取第一个元素 */
        public int top() {
            return queue1.peek();
        }
    
        /** 返回队列是否为空 */
        public boolean empty() {
            return queue1.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 潜行1 我是火车王! 普通 2022年10月27日 下午8:56

    双队列

    from collections import deque
    class MyStack:
    
        def __init__(self):
            """
            Initialize your data structure here.
            """
            self.queue1 = deque()
            self.queue2 = deque()
    
    
        def push(self, x: int) -> None:
            """
            Push element x onto stack.
            """
            self.queue1.append(x)
            while self.queue2:
                tmp = self.queue2.popleft()
                self.queue1.append(tmp)
            self.queue1, self.queue2 = self.queue2, self.queue1
    
    
        def pop(self) -> int:
            """
            Removes the element on top of the stack and returns that element.
            """
            return self.queue2.popleft()
    
    
        def top(self) -> int:
            """
            Get the top element.
            """
            if self.queue2:
                return self.queue2[0]
    
    
        def empty(self) -> bool:
            """
            Returns whether the stack is empty.
            """
            return not bool(self.queue2)
    
    
    
    # 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()
    
    0 赞同 0 条回复
  • just 普通 2022年10月27日 下午8:10

    //典中典
    class MyStack {
    public:
    queue que1,que2;
    MyStack() {

    }
    
    void push(int x) {
        que1.push(x);
    
    }
    
    int pop() {
       int size=que1.size();
       size--;
       while(size--){
           que2.push(que1.front());
           que1.pop();
       }
       int res=que1.front();
       que1.pop();
       while(!que2.empty()){
           que1.push(que2.front());
           que2.pop();
       }
       return res;
    }
    
    int top() {
        return que1.back();
    
    }
    
    bool empty() {
          return que1.empty();
    }
    

    };

    0 赞同 0 条回复
  • 星河 普通 2022年10月27日 下午6:15
    class MyStack {
        Queue<Integer> queue1;
        Queue<Integer> queue2;
    
        /** Initialize your data structure here. */
        public MyStack() {
            queue1 = new LinkedList<Integer>();
            queue2 = new LinkedList<Integer>();
        }
    
        /** Push element x onto stack. */
        public void push(int x) {
            queue2.offer(x);
            while (!queue1.isEmpty()) {
                queue2.offer(queue1.poll());
            }
            Queue<Integer> temp = queue1;
            queue1 = queue2;
            queue2 = temp;
        }
    
        /** Removes the element on top of the stack and returns that element. */
        public int pop() {
            return queue1.poll();
        }
    
        /** Get the top element. */
        public int top() {
            return queue1.peek();
        }
    
        /** Returns whether the stack is empty. */
        public boolean empty() {
            return queue1.isEmpty();
        }
    }
    时间O(N) O(1),空间O(N)
    
    0 赞同 0 条回复
  • lobort 普通 2022年10月27日 下午4:01
    class MyStack {
        Queue<Integer> in;
        Queue<Integer> out;
        public MyStack() {
            in = new LinkedList<Integer>();   //空队列  数据输入
            out = new LinkedList<Integer>();   //原始的数据存在这里  
        }
    
        public void push(int x) {
            in.offer(x);
            while(!out.isEmpty()){
                in.offer(out.poll());
            }
            Queue<Integer> temp = in; //设置中转队列 
            in = out;
            out = temp;
        }
    
        public int pop() {
            return out.poll();
        }
    
        public int top() {
            return out.peek();
        }
    
        public boolean empty() {
            return out.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • Chin 普通 2022年10月27日 下午3:27
    class MyStack {
        Queue<Integer> queue1;
        Queue<Integer> queue2;
        public MyStack() {
            queue1 = new LinkedList<>();
            queue2 = new LinkedList<>();
        }
    
        public void push(int x) {
            //  先加到queue2
            queue2.offer(x);
            //  把queue1 的搬到queue2里
            while(!queue1.isEmpty()){
                queue2.offer(queue1.poll());
            }
            //  倒序
            Queue<Integer> tmp = queue1;
            queue1  = queue2;
            queue2 = tmp;
        }
    
        public int pop() {
           return queue1.poll();
        }
    
        public int top() {
           return queue1.peek();
        }
    
        public boolean empty() {
           return queue1.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 追 普通 2022年10月27日 上午11:02
    class MyStack {
    public:
        queue<int> queue1;
        queue<int> queue2;
        MyStack() {}
        //将新输入的数据通过队列2使该元素在数据最前面,完成输入之后将队列2所有的数据给到队列1即为栈的数据顺序
        void push(int x) {      
            queue2.push(x);
            while(!queue1.empty()){
                queue2.push(queue1.front());
                queue1.pop();
            }
            //两个队列元素交换有现成的函数可以使用
            swap(queue1,queue2);
        }
    
        //注意队列的取数以及删除队列首元素的语法
        int pop() {
            int p = queue1.front();
            queue1.pop();
            return p;
        }
    
        int top() {
            return queue1.front();
        }
    
        bool empty() {
            return queue1.empty();
        }
    };
    

    注意:在插入数据后需要将两个队列的元素进行交换,以保证插入数据后队列2的数据顺序即为栈的数据顺序

    0 赞同 0 条回复
  • 鸿渐 普通 2022年10月27日 上午10:20
     Queue<Integer> queue1;
        Queue<Integer> queue2;
    
        public MyStack() {
            queue1 = new LinkedList<Integer>(); //主队列
            queue2 = new LinkedList<Integer>();//辅助队列
        }
    
        public void push(int x) {
            queue2.offer(x);
            //为了实现栈的先进后出的原则,添加的基本思路就是将主队列中原来的元素放在辅助队列当中,这样原来先进的元素在辅助队列中就是后进的
            while (!queue1.isEmpty()) {
                queue2.offer(queue1.poll());
            }
            //将辅助队列和主队列叫唤一下
            Queue<Integer> temp = queue1;
            queue1 = queue2;
            queue2 = temp;
        }
    
        public int pop() {
            return queue1.poll();
        }
    
        public int top() {
            return queue1.peek();
        }
    
        public boolean empty() {
            return queue1.isEmpty();
        }
    
    
    
    0 赞同 0 条回复
  • 绍熙 普通 2022年10月27日 上午10:16

    解题思路
    根据题意,要用两个队列来实现栈,首先我们知道,队列是先进先出,栈是后进先出。

    知道了以上要点,我们两个队列的用处也就一目了然了。

    一个队列为主队列,一个为辅助队列,当入栈操作时,我们先将主队列内容导入辅助队列,然后将入栈元素放入主队列队头位置,再将辅助队列内容,依次添加进主队列即可。

    class MyStack {
        Queue<Integer> queue1;
        Queue<Integer> queue2;
        public MyStack() {
            queue1 = new LinkedList<Integer>();
            queue2 = new LinkedList<Integer>();
        }
    
        public void push(int x) {
            queue2.offer(x);
            while (!queue1.isEmpty()) {
                queue2.offer(queue1.poll());
            }
            Queue<Integer> temp = queue1;
            queue1 = queue2;
            queue2 = temp;
        }
    
        public int pop() {
            return queue1.poll();
        }
    
        public int top() {
            return queue1.peek();
        }
    
        public boolean empty() {
            return queue1.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 酥合 普通 2022年10月26日 下午11:52
    class MyStack {
    
        private LinkedList<Integer> a;
        private LinkedList<Integer> b;
    
        public MyStack() {
            a = new LinkedList<Integer>();
            b = new LinkedList<Integer>();
        }
    
        public void push(int x) {
            a.offer(x);
        }
    
        public int pop() {
            if(!b.isEmpty() && a.isEmpty()) {
                while(!b.isEmpty()) {
                    a.offer(b.poll());
                }
            }
    
            while(a.size() > 1){
                b.offer(a.poll());
            }
            return a.poll();
        }
    
        public int top() {
            if(!b.isEmpty() && a.isEmpty()) {
                while(!b.isEmpty()) {
                    a.offer(b.poll());
                }
            }
            while(a.size() > 1){
                b.offer(a.poll());
            }
            return a.peek();
        }
    
        public boolean empty() {
            return a.isEmpty() && b.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();
     */
    

    好像这个题目的内存占用都很高。。。

    0 赞同 0 条回复
  • Y7n05h 普通 2022年10月26日 下午10:06
    class MyStack {
        std::deque<int> queue;
    
    public:
        MyStack() = default;
    
        void push(int x) {
            std::deque<int> tmp;
            tmp.swap(queue);//交换
            queue.push_back(x);
            for (auto i : tmp) {
                queue.push_back(i);
            }
        }
    
        int pop() {
            auto tmp = queue.front();
            queue.pop_front();
            return tmp;
        }
    
        int top() {
            return queue.front();
        }
    
        bool empty() {
            return queue.empty();
        }
    };
    
    0 赞同 0 条回复
  • symbol 普通 2022年10月26日 下午9:19
    type MyStack struct {
        in_que, out_que []int
    }
    
    func Constructor() MyStack {
        return MyStack{}
    }
    
    func (this *MyStack) Push(x int)  {
        this.in_que = append(this.in_que, x)
    }
    
    func (this *MyStack) Pop() int {
        this.in2out()
        value := this.out_que[len(this.out_que)-1]
        this.out_que=this.out_que[:len(this.out_que)-1] //更新元素
        return value
    }
    
    
    func (this *MyStack) Top() int {
        this.in2out()
        return this.out_que[len(this.out_que)-1]
    }
    
    
    func (this *MyStack) Empty() bool {
        this.in2out()
        return len(this.out_que) == 0
    
    }
    func (this * MyStack) in2out(){
        for len(this.in_que) > 0{
            this.out_que = append(this.out_que,this.in_que[0])
            this.in_que = this.in_que[1:] //更新元素
        }
    }
    
    0 赞同 0 条回复
  • 晨 普通 2022年10月26日 下午8:46
    class MyStack(object):
    
        def __init__(self):
            # queue2用于辅助实现栈的操作
            self.queue1 = collections.deque()
            self.queue2 = collections.deque()
    
    
        def push(self, x):
            """
            :type x: int
            :rtype: None
            """
            # 把需要入栈的值加入queue2,再把queue1的所有元素加入queue2,交换queue1与queue2
            self.queue2.append(x)
            while self.queue1:
                self.queue2.append(self.queue1.popleft())
            self.queue1,self.queue2 = self.queue2,self.queue1
    
        def pop(self):
            """
            :rtype: int
            """
            return self.queue1.popleft()
    
    
        def top(self):
            """
            :rtype: int
            """
            return self.queue1[0]
    
        def empty(self):
            """
            :rtype: bool
            """
            return not self.queue1
    
    
        def pop(self):
            """
            Removes the element on top of the stack and returns that element.
            """
            return self.queue1.popleft()
    
    
    0 赞同 0 条回复
  • mpweixin用户 永久会员 2022年10月26日 下午7:21

    “`{r}
    class MyStack {
    Queue queue1;
    Queue
    queue2;

    public MyStack() {
        queue1 = new LinkedList<Integer>();
        queue2 = new LinkedList<Integer>();
    }
    
    public void push(int x) {
        queue2.offer(x);
        while (!queue1.isEmpty()) {
            queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }
    
    public int pop() {
        return queue1.poll();
    }
    
    public int top() {
        return queue1.peek();
    }
    
    public boolean empty() {
        return queue1.isEmpty();
    }
    

    }

    “`

    0 赞同 0 条回复
  • 庄重 普通 2022年10月26日 下午7:18
    //思路:
        // pop:返回q1队列back,把尾部数据以外的数据push到q2队列
        // push:push的时候需要把数据push到有数据的队列中
    class MyStack {
    public:
        MyStack() {
            while(!q1.empty()) q1.pop();
            while(!q2.empty()) q2.pop();        
        }
    
        void push(int x) {
            if(!q1.empty() ||(q1.empty() && q2.empty())) q1.push(x);
    
            if(!q2.empty())
                q2.push(x);
        }
    
        int pop() {
            if(q1.empty() && q2.empty()) return -1;
    
            int ret = 0;
            //q1管道不为空
            if(!q1.empty()){
                ret = q1.back();
    
                for(;q1.size() > 1;){//注意:size()是变化的,上一个题目不能用就是因为没有注意到
                    q2.push(q1.front());
                    q1.pop();
                }
                q1.pop();
                return ret;
            }
            //又忘了把retrun 放到if里面了
            if(!q2.empty()){
                ret = q2.back();
                for(;q2.size() > 1;){
                    q1.push(q2.front());
                    q2.pop();
                }
    
                q2.pop();
    
                return ret;
            }
            return -1;
        }
    
        int top() {
            if(q1.empty()&&q2.empty()) return -1;
            return q1.empty() ? q2.back() : q1.back();
        }
    
        bool empty() {
            if(!q2.empty() || !q1.empty()) return false;
            return true;
        }
        queue<int> q1;
        queue<int> q2; 
    };
    //时间复杂度O(1) 不太确定
    //空间复杂度O(1)
    
    0 赞同 0 条回复
  • 虾仁猪心 普通 2022年10月26日 下午7:14
    class MyStack {
        Queue<Integer> q1;
        Queue<Integer> q2;
    
        public MyStack() {
            q1 = new LinkedList<>();
            q2 = new LinkedList<>();
    
        }
    
        public void push(int x) {
             // LinkedList.offer()向链表末尾添加元素,返回是否成功,成功为 true,失败为 false。
            // 先放在辅助队列中
            q2.offer(x);
            while(!q1.isEmpty()){
                //LinkedList.poll()方法是删除并返回第一个元素
                q2.offer(q1.poll());
            }
            // 最后交换queue1和queue2,将元素都放到queue1中
            Queue qtemp;
            qtemp = q1;
            q1 = q2;
            q2 = qtemp;
    
        }
    
        public int pop() {
            return q1.poll();
    
        }
    
        public int top() {
            return q1.peek();
        }
    
        public boolean empty() {
            return q1.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();
     */
    
    0 赞同 0 条回复
  • 你有点可爱喔 普通 2022年10月26日 下午5:46

    思路:原理与上一道题类似,边界性考虑,栈的特性先进后出,双队列实现。一个队列压入,一个队列弹出。

    class MyStack {
        Deque<Integer> deque1;
        Deque<Integer> deque2;
    
        public MyStack() {
            deque1 = new ArrayDeque<>();
            deque2 = new ArrayDeque<>();
        }
    
        public void push(int x) {
            deque1.add(x);
        }
    
        public int pop() {
            while(deque1.size()>1){
                deque2.add(deque1.poll());
            }
            int x = deque1.poll();
            while(!deque2.isEmpty()){
                deque1.add(deque2.poll());
            }
            return x;
        }
    
    
        //
        public int top() {
            int x = 0;
            while(!deque1.isEmpty()){
                x = deque1.poll();
                deque2.add(x);
            }
            while(!deque2.isEmpty()){
                deque1.add(deque2.poll());
            }
            return x;
        }
    
        public boolean empty() {
            return deque1.isEmpty();
    
        }
    }
    
    
    0 赞同 0 条回复
  • Haoyun 普通 2022年10月26日 下午5:29
    // 一个队列为主队列,一个为辅助队列
    var MyStack = function() {
       this.que1 = [];
       this.que2 = [];
    };
    
    
    MyStack.prototype.push = function(x) {
      this.que1.push(x);
    };
    
    
    MyStack.prototype.pop = function() {
      while(this.que1.length) {
          this.que2.push(this.que1.shift())
      }
      return this.que2.pop();
    };
    
    MyStack.prototype.top = function() {
        //用写好的方法
       const x = this.pop();
       this.que1.push(x);
       return x;
    };
    
    
    
    MyStack.prototype.empty = function() {
      return !this.que1.length && ! this.que2.length;
    };
    
    0 赞同 0 条回复
  • 刺猬 普通 2022年10月26日 下午5:25
    方法一:
    class MyStack {
        queue<int> inQueue;
        queue<int> outQueue;
    public:
        MyStack() {
    
        }
    
        void push(int x) {
            outQueue.push(x);
            while(!inQueue.empty()){
                int value = inQueue.front();
                outQueue.push(value);
                inQueue.pop();
            }
            swap(inQueue,outQueue);
        }
    
        int pop() {
            int value = inQueue.front();
            inQueue.pop();
            return value;
        }
    
        int top() {
            return inQueue.front();
        }
    
        bool empty() {
            return inQueue.empty();
        }
    };
    方法二:
    class MyStack {
        queue<int> inQueue;
        queue<int> outQueue;
    public:
        MyStack() {
    
        }
    
        void push(int x) {
            inQueue.push(x);
        }
    
        int pop() {
            while(!outQueue.empty())
                outQueue.pop();
            while(inQueue.size() > 1){
                int value = inQueue.front();
                inQueue.pop();
                outQueue.push(value);
            }
            int value = inQueue.front();
            inQueue.pop();
            swap(inQueue,outQueue);
            return value;
        }
    
        int top() {
            int value = pop();
            push(value);
            return value;
    
        }
    
        bool empty() {
            return inQueue.empty();
        }
    };
    

    两种方法,第一种较为简单,第二种略有繁琐。

    0 赞同 0 条回复
  • 派大星 普通 2022年10月26日 下午3:27
    class MyStack {
    //使用两个队列来实现栈,一个用来存取和退出数据,另一个做缓存使用,出栈时,把存放数据的队列里的数据除最后一个意外全存放到
    //另一个队列中,再退出最后一个数据。
        Queue<Integer> queue1;
        Queue<Integer> queue2;
    
        public MyStack() {
            queue1 = new LinkedList<>();
            queue2 = new LinkedList<>();
        }
    
        public void push(int x){
            if(queue1.isEmpty()&&queue2.isEmpty()){
                queue1.add(x);
            } else if (queue1.isEmpty()) {
                queue2.add(x);
            }else{
                queue1.add(x);
            }
        }
    
        public int pop(){
            if(queue1.isEmpty()&&queue2.isEmpty()){
                return -1;
            } else if (queue1.isEmpty()) {
                while(queue2.size()!=1){
                    queue1.add(queue2.remove());
                }
                int a = queue2.remove();
                return a;
            }else{
                while(queue1.size()!=1){
                    queue2.add(queue1.remove());
                }
                int a = queue1.remove();
                return a;
            }
        }
    
        public int top(){
            if(queue1.isEmpty()&&queue2.isEmpty()){
                return -1;
            } else if (queue1.isEmpty()) {
                int a = 0;
                while(queue2.size()!=0){
                    if(queue2.size()==1){a = queue2.element();}
                    queue1.add(queue2.remove());
                }
                return a;
            }else{
                int a = 0;
                while(queue1.size()!=0){
                    if(queue1.size()==1){a = queue1.element();}
                    queue2.add(queue1.remove());
                }
                return a;
            }
        }
    
        public boolean empty(){
            if(queue1.isEmpty()&&queue2.isEmpty()){
                return true;
            }else{
                return false;
            }
        }
    }
    
    0 赞同 0 条回复
  • 马啸天 永久会员 2022年10月26日 下午2:46
        Queue<Integer> queue1;
        Queue<Integer> queue2;
    
        public MyStack() {
            queue1 = new LinkedList<Integer>();
            queue2 = new LinkedList<Integer>();
        }
    
        //将元素x压入栈中
        public void push(int x) {
            queue2.offer(x);
    
            while (!queue1.isEmpty()){
                queue2.offer(queue1.poll());
            }
    
            Queue<Integer> temp=queue1;
            queue1=queue2;
            queue2=temp;
    
        }
    
        //移除并返回栈顶元素
        public int pop() {
            return queue1.poll();
        }
    
        //返回栈顶元素
        public int top() {
            return queue1.peek();
        }
    
        //判断是否为null
        public boolean empty() {
            return queue1.isEmpty();
        }
    
    0 赞同 0 条回复
  • Tolkien 永久会员 2022年10月26日 下午2:31
    1. 时间复杂度:O(n)
    2. 空间复杂度:O(n)
    3. 代码
    class MyStack {
        Queue<Integer> queue1;
        Queue<Integer> queue2;
    
        public MyStack() {
            queue1 = new LinkedList<>();
            queue2 = new LinkedList<>();
    
        }
    
        // 将q2作为栈,q1作为入栈数据的中转站
        public void push(int x) {
            // 1. 首先向q1入队要入栈的元素(q1始终保持只有一个元素)
            queue1.add(x);
    
            // 2. 将栈中的元素入队至q1,此时元素x在q1的队头,实现了入栈
            while (!queue2.isEmpty()) {
                queue1.add(queue2.remove());
            }
    
            // 2. 将q1和q2交换,使q2作为新的栈,q1清零
            Queue<Integer> temp = queue2;
            queue2 = queue1;
            queue1 = temp;
        }
    
        public int pop() {
            return queue2.remove();
        }
    
        public int top() {
            return queue2.peek();
        }
    
        public boolean empty() {
            return queue2.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 小肸 永久会员 2022年10月26日 下午1:46

    我的思路:用两个队列实现栈,那肯定需要一个队列作为辅助队列。我用了两个队列queue1,queue2,其中queue2是给queue1打辅助的,不像用两个栈实现一个队列的思路解决这个问题,因为队列是先进先出的。把queue1的元素全部入队到queue2中,元素的出顺序是没有变化的。我是在出栈处上做文章,而leetcode官方题解是在入栈处做文章。入栈时直接入队到queue1中,出栈时queue1队尾的元素就是栈顶元素,我们需要获得它,直接将queue1队尾之前的元素全部入队到queue2,取得它,再把queue2的元素全部入队到queue1中。

    class MyStack {
        private Queue<Integer> queue1;
        private Queue<Integer> queue2;
        public MyStack() {
            queue1 = new LinkedList<>();
            queue2 = new LinkedList<>();
        }
    
        public void push(int x) {
            queue1.add(x);
        }
    
        public int pop() {
            while (queue1.size() > 1) {
                queue2.add(queue1.poll());
            }
            int res = queue1.poll();
            while (!queue2.isEmpty()) {
                queue1.add(queue2.poll());
            }
            return res;
        }
    
        public int top() {
            while (queue1.size() > 1) {
                queue2.add(queue1.poll());
            }
            int res = queue1.poll();
            queue2.add(res);
            while (!queue2.isEmpty()) {
                queue1.add(queue2.poll());
            }
            return res;
        }
    
        public boolean empty() {
            return queue1.isEmpty();
        }
    }
    

    leetcode官方题解的两种思路:一种用了两个队列queue1(作为真正的栈),queue2,入栈时元素e入队到queue2中,在把queue1的元素全部入队到queue2中,最后交换queue1、queue2,这样queue1队首的元素就是栈顶的元素,而queue2是空队。另一种用一个队列实现,就是在入栈时,把队列的队尾之前的元素再重新入队到这个队列。

    0 赞同 0 条回复
  • @ 普通 2022年10月26日 下午12:00

    思路:q1和q2两个队列,每次出栈时,q2依次入队q1出队的数据,直到q1剩下最后一个,这个数就是待出栈的数。接着把这个数暂存起来,q1再依次入队q2出队的数据,最后把暂存的那个数返回即可.

    class MyStack {
        Queue<Integer> q1;
        Queue<Integer> q2;
    
        public MyStack() {
    
            q1 = new LinkedList<Integer>();
            q2 = new LinkedList<Integer>();
        }
    
        public void push(int x) {
            q1.add(x);
    
        }
    
        public int pop() {
            if(q1.isEmpty())
                return -1;
    
            while(q1.size() > 1){
                q2.add(q1.remove());
            }
    
            Integer res = q1.remove();
    
            while(!q2.isEmpty()){
                q1.add(q2.remove());
            }
    
    
            return res;
        }
    
        public int top() {
            while(q1.size() > 1){
                q2.add(q1.remove());
            }
    
            Integer res = q1.peek();
            q2.add(q1.remove());
    
            while(!q2.isEmpty()){
                q1.add(q2.remove());
            }
    
            return res;
        }
    
        public boolean empty() {
            return q1.isEmpty();
        }
    
        public static void main(String[] args) {
            MyStack myStack = new MyStack();
            myStack.push(1);
            myStack.push(2);
            System.out.println(myStack.top());
            System.out.println(myStack.pop());
        }
    }
    
    0 赞同 0 条回复
  • 感到自己好渺小 普通 2022年10月26日 上午10:17
    class MyStack {
        int top;
        Queue<Integer> queue1;
        Queue<Integer> queue2;
        public MyStack() {
            //初始化两个栈,一个queue1为主队列,一个queue2为辅助队列
            //主队列:用来执行删除栈顶元素,存储栈内的元素
            //辅助队列的唯一作用:用来保持栈内元素在队列中的顺序
            //先将要增加的元素压入辅助队列,再将主队列中的所有元素存入辅助队列,这时辅助队列中的元素顺序和模拟栈中元素顺序相同,再把辅助队列复制到主队列
            queue1 = new LinkedList<>();
            queue2 = new LinkedList<>();
        }
            //模拟栈压入操作
        public void push(int x) {
            queue2.offer(x);            //先将增加的元素压入辅助队列中
            top = x;            //因为是用2个队列模拟栈,栈是后进先出,所以新加入的元素为栈顶元素,将top指向x
            while(!queue1.isEmpty())   //如果主队列不为空,将主队列中所有元素增加到辅助队列中,保持顺序一致,新增加的元素为栈顶元素
            {
                queue2.offer(queue1.poll());
            }
            Queue<Integer> temp = queue1;  //将辅助队列中的元素复制给主队列
            queue1 = queue2;
            queue2 = temp;
        }
    
        public int pop() {
            int e = queue1.poll();   //将主队列的队头元素(模拟栈的栈顶元素)弹出,用变量e记录其值
            if(!queue1.isEmpty())    //如果主队列不为空,将会更新栈顶元素 top = queue1.peek();
            {
                top = queue1.peek();
            }
            return e;
        }
    
        public int top() {
            return top;
        }
    
        public boolean empty() {   //判断栈内元素是否为空,即判断主队列中是否有元素
            return queue1.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 猫猫真可爱 普通 2022年10月26日 上午10:06

    两个队列queue1、queue2,queue1在没有push时保存空队列,在push时先将数据加入到queue1,再将queue2的数据加入到queue1,保证queue1为空就将queue1的数据在加入到queue2。这是对queue2的poll(获取并移除此队列的头)操作就相当于对栈的出栈操作。

    class MyStack {
        Queue<Integer> queue1;
        Queue<Integer> queue2;
        public MyStack() {
            queue1 = new LinkedList<>();
            queue2 = new LinkedList<>();
        }
    
        public void push(int x) {
            queue1.offer(x);
            while(!queue2.isEmpty()){
                queue1.offer(queue2.poll());
            }
            while(!queue1.isEmpty()){
                queue2.offer(queue1.poll());
            }
        }
    
        public int pop() {
            return queue2.poll();
        }
    
        public int top() {
            return queue2.peek();
        }
    
        public boolean empty() {
            return queue2.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 是梦终空 永久会员 2022年10月26日 上午8:16

    一个queue实现,主要在push部分,每添加一个数就重新排序,让队首的到队尾去

    class MyStack {
        Queue<Integer> que;
        public MyStack() {
            que = new LinkedList<>();
        }
    
        public void push(int x) {
            que.offer(x);
            int size = que.size();
            while(size-- > 1){
                que.offer(que.remove());
            }
        }
    
        public int pop() {
            return que.poll();
        }
    
        public int top() {
            return que.peek();
        }
    
        public boolean empty() {
            return que.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 黎昕 普通 2022年10月26日 上午1:33

    C语言实现 两个队列代替栈

    注:根据题目原因,直接采用一个定长数组充当队列,减少了一些移动操作,所以代码用于解题可以,但是实际上数据量一大会出问题,解决方法是每次将数组元素往前挪front位,但是会消耗大量时间,解决方法2是使用链式队列

    push操作
    时间复杂度:O(n)
    空间复杂度:O(n) 使用了另外一个栈作为缓冲空间

    pop操作
    时间复杂度:O(1)
    空间复杂度:O(1)

    top操作
    时间复杂度:O(1)
    空间复杂度:O(1)

    empty操作
    时间复杂度:O(1)
    空间复杂度:O(1)

    leetcode 时间beats 100%
    空间 beats 22.3%

    #define MAX_LENGTH 101
    typedef struct {
        int que[MAX_LENGTH];
        int front;//初始状态下 front=0
        int rear;//初始状态下 rear=0;栈空时 rear=front;本题中,因为只有100次操作,所以不会出现栈满情况
    }MyQueue;
    
    typedef struct {
        MyQueue* q1;
        MyQueue* q2;
    } MyStack;
    
    MyStack* myStackCreate() {
        MyStack* st = (MyStack*)malloc(sizeof(MyStack));
        st->q1 = (MyQueue*)malloc(sizeof(MyQueue));
        st->q2 = (MyQueue*)malloc(sizeof(MyQueue));
        st->q1->front = 0;
        st->q2->front = 0;
        st->q1->rear = 0;
        st->q2->rear = 0;
        return st;
    }
    
    void myStackPush(MyStack* obj, int x) {
        //将x入q2
        obj->q2->que[obj->q2->rear++] = x;
        //将q1全部出队并依次入队到q2
        while (obj->q1->rear != obj->q1->front) {
            obj->q2->que[obj->q2->rear++] = obj->q1->que[obj->q1->front++];
        }
        //交换q1 q2
        MyQueue* tmp = obj->q1;
        obj->q1 = obj->q2;
        obj->q2 = tmp;
    }
    
    int myStackPop(MyStack* obj) {//题目要求,每次调用时不为空
        int tmp = obj->q1->que[obj->q1->front++];
        return tmp;
    }
    
    int myStackTop(MyStack* obj) {//题目要求:每次调用时都不为空
        int tmp = obj->q1->que[obj->q1->front];
        return tmp;
    }
    
    bool myStackEmpty(MyStack* obj) {
        return obj->q1->rear == obj->q1->front;
    }
    
    void myStackFree(MyStack* obj) {
        free(obj->q1);
        free(obj->q2);
        free(obj);
    }
    
    /**
     * Your MyStack struct will be instantiated and called as such:
     * MyStack* obj = myStackCreate();
     * myStackPush(obj, x);
    
     * int param_2 = myStackPop(obj);
    
     * int param_3 = myStackTop(obj);
    
     * bool param_4 = myStackEmpty(obj);
    
     * myStackFree(obj);
    */
    
    
    0 赞同 0 条回复
  • cxc 普通 2022年10月26日 上午12:25
    class MyStack {
        Queue<Integer> q1, q2;
        public MyStack() {
            q1 = new LinkedList<>();
            q2 = new LinkedList<>();
        }
    
        public void push(int x) {
            q2.add(x);
            while(!q1.isEmpty()) {
                q2.add(q1.poll());
            }
    
    //交换两个队列,保证在不push时queue1始终为空
            Queue<Integer> temp = q1;
            q1 = q2;
            q2 = temp;
        }
    
        public int pop() {
            return q1.poll();
        }
    
        public int top() {
            return q1.peek();
        }
    
        public boolean empty() {
            return q1.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • yanshuojune 普通 2022年10月26日 上午12:16

    解题思路:栈为先入后出,使用队列(先入先出),需要保证最后入队列的元素最先出队列
    时间复杂度:push为O(n),其余为O(1)
    空间复杂度:O(1)

    class MyStack:
    
        def __init__(self):
            self.Q1 = collections.deque()
            self.Q2 = collections.deque()
    
        def push(self, x: int) -> None:
            # 最先入栈,最后出栈
            self.Q2.append(x)
            while self.Q1:
                self.Q2.append(self.Q1.popleft())
            self.Q1,self.Q2 = self.Q2,self.Q1
    
        def pop(self) -> int:
            return self.Q1.popleft()
    
        def top(self) -> int:
            return self.Q1[0]
    
        def empty(self) -> bool:
            return not self.Q1
    
    0 赞同 0 条回复
  • 天然 普通 2022年10月26日 上午12:10

    位置交换

    class MyStack(object):
    
        def __init__(self):
            self.lst1, self.lst2 =[],[]
    
        def push(self, x):
            """
            :type x: int
            :rtype: None
            """
            self.lst1.append(x)
            while self.lst2:
                self.lst1.append(self.lst2.pop(0))
            self.lst1,self.lst2 = self.lst2,self.lst1
    
    
        def pop(self):
            """
            :rtype: int
            """
            return self.lst2.pop(0)
    
    
        def top(self):
            """
            :rtype: int
            """
            return self.lst2[0]
    
    
        def empty(self):
            """
            :rtype: bool
            """
            if self.lst2:
                return False
            else:
                return True
    
    
    
    
    # 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()
    
    
    0 赞同 0 条回复
  • Ruby🗽 普通 2022年10月26日 上午12:09
    class MyStack {
    
        Queue<Integer> queue1;
        Queue<Integer> queue2;
    
       //此处和用栈实现队列思路一致
        public MyStack() {
            queue1 = new LinkedList<Integer>();
            queue2 = new LinkedList<Integer>();
        }
    
        public void push(int x) {
            queue1.offer(x);
            while (!queue2.isEmpty()){
                queue1.add(queue2.poll());
            }
            Queue<Integer> temp = queue2;
            queue2 = queue1;
            queue1 = temp;
        }
    
        public int pop() {
            return queue2.poll();
        }
    
        public int top() {
            return queue2.peek();
        }
    
        public boolean empty() {
            return queue2.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • Gg 普通 2022年10月26日 上午12:05
    class MyStack {
    
        Queue<Integer> q;
    
        public MyStack() {
            q = new LinkedList<>();
        }
    
        public void push(int x) {
            q.add(x);
        }
    
        public int pop() {
            // 取出size-1个元素,重新插入
            int size = q.size();
            while(size-- > 1){
                q.add(q.poll());
            }
            return q.poll();
        }
    
        public int top() {
            // 取出size-1个元素,重新插入
            int size = q.size();
            while(size-- > 1){
                q.add(q.poll());
            }
            // 取出第一个作为结果返回后,重新插入
            int res = q.poll();
            q.add(res);
            return res;
        }
    
        public boolean empty() {
            return q.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 宁 永久会员 2022年10月26日 上午12:00

    使用一个队列

    class MyStack {
        Queue<Integer> queue;
        public MyStack() {
            queue = new LinkedList<>();
        }
    
        public void push(int x) {
            queue.add(x);
        }
    
        public int pop() {
            int size = queue.size();
            while(size > 1){
                queue.add(queue.poll());
                size--;
            }
            return queue.poll();
        }
    
        public int top() {
            int size = queue.size();
            while(size > 1){
                queue.add(queue.poll());
                size--;
            }
            int ret = queue.poll();
            queue.add(ret);
            return ret;
    
        }
    
        public boolean empty() {
            return queue.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 訁訁訁訁訁 普通 2022年10月25日 下午11:35

    class MyStack {
        private Queue<Integer> queue1;
        private Queue<Integer> queue2;
        public MyStack() {
            queue1 = new LinkedList<>();
            queue2 = new LinkedList<>();
        }
    
        public void push(int x) {
            queue1.add(x);
            while(!queue2.isEmpty()){
                queue1.add(queue2.remove());
            }
            //交换两个队列,保证在不push时queue1始终为空
            Queue tmp = queue1;
            queue1 = queue2;
            queue2 = tmp;
        }
    
        public int pop() {
            return queue2.remove();
        }
    
        public int top() {
            return queue2.peek();
        }
    
        public boolean empty() {
            return queue2.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 青木 普通 2022年10月25日 下午11:31
    // 时间复杂度O(1)
    // 空间复杂度O(n)
    // 本来想的是一直循环到最后一个,然后看了题解直接倒着存,还是太菜了
    class MyStack {
    
        Deque<Integer> q1;
        Deque<Integer> q2;
    
        public MyStack() {
            q1 = new LinkedList<>();
            q2 = new LinkedList<>();
        }
    
        public void push(int x) {
            q2.offer(x);
            while(!q1.isEmpty()){
                q2.offer(q1.poll());
            }
            Deque<Integer> q = q1;
            q1 = q2;
            q2 = q;
        }
    
        public int pop() {
            return q1.poll();
        }
    
        public int top() {
            return q1.peek();
        }
    
        public boolean empty() {
            return q1.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 优秀市民 普通 2022年10月25日 下午11:05
    class MyStack {
    
        Queue<Integer> q1;
        Queue<Integer> q2;
    
        public MyStack() {
            q1 = new LinkedList<Integer>();
            q2 = new LinkedList<Integer>();
        }
    
        public void push(int x) {
            q2.offer(x);
            while(!q1.isEmpty()){
                q2.offer(q1.poll());
            }
            Queue<Integer> temp = q1;
            q1 = q2;
            q2 = temp;
        }
    
        public int pop() {
            return q1.poll();
    
        }
    
        public int top() {
            return q1.peek();
    
        }
    
        public boolean empty() {
            return q1.isEmpty();
    
        }
    }
    
    

    第一个队列是主队列,第二个是辅助队列,每次模拟入栈的时候先入辅助队,然后把主队列从左出队,入辅助队列,然后把辅助队赋给主队列,辅助队为空

    0 赞同 0 条回复
  • T 普通 2022年10月25日 下午10:54

    下面代码

    class MyStack {
        Queue<Integer> A, B;
        public MyStack() {
            this.A = new LinkedList<>();
            this.B = new LinkedList<>();
        }
        // A用于存储数据, B作为辅助,始终让后插入的元素在队列头部
        // 通过交换,让B队列始终为空。
        public void push(int x) {
            B.offer(x);
            while(!A.isEmpty())
                B.offer(A.poll());
    
            Queue<Integer> temp = B;
            B = A;
            A = temp;
        }
    
        public int pop() {
            return A.poll();
        }
    
        public int top() {
            return A.peek();
        }
    
        public boolean empty() {
            return A.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 狗蛋儿 普通 2022年10月25日 下午10:42

    投机取巧

    这里借别处老哥的方法写一下思路
    这里只开一个队列,将原来需要将暂存到辅助队列里面的直接插入到队列的队尾
    不得不说还是很舒服呀。

    class MyStack {
    public:
        MyStack() {
    
        }
        queue<int> que1;
    
    
    
        void push(int x) {
            que1.push(x);
        }
    
        int pop() {
            int size = que1.size();
            --size;
            while(size--){
                que1.push(que1.front());
                que1.pop();
            }
            int res =que1.front();
            que1.pop();
            return res; 
        }
    
        int top() {
            return que1.back();
        }
    
        bool empty() {
            return que1.empty();
        }
    };
    
    1 赞同 0 条回复
  • 西西弗斯的石头 永久会员 2022年10月25日 下午10:40

    交换队列法,第一个队列为空,第二个队列为栈,入队首先入第一个队列,如果第二个队列有值,则将第二个队列的所有元素出队再入队第一个队列,然后交换第一个队列和第二个队列,第二个队列就为栈了。

    class MyStack {
        Queue<Integer> queue1;
        Queue<Integer> queue2;
        public MyStack() {
            queue1 = new LinkedList<>();
            queue2 = new LinkedList<>();
        }
    
        public void push(int x) {
            queue1.add(x);
            while(!queue2.isEmpty()) queue1.add(queue2.poll());
            //交换a,b队列
            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();
     */
    
    0 赞同 0 条回复
  • Error 普通 2022年10月25日 下午10:09
    class MyStack:
    
        def __init__(self):
            self.stack = []
    
    
        def push(self, x: int) -> None:
            self.stack.append(x)
    
    
        def pop(self) -> int:
            if self.empty:
                return self.stack.pop(-1)
            return []
    
    
    
        def top(self) -> int:
            if self.empty:
                return self.stack[-1]
            return []
    
    
        def empty(self) -> bool:
            if self.stack:
                return False
            return True
    

    使用list 实现

    0 赞同 0 条回复
  • 单个酒窝儿 普通 2022年10月25日 下午10:05

    1、弄俩队列,一个是主队列,一个是辅助队列,新加元素时先将元素放入辅助队列中,在将主队列元素存储到辅助队列中,最后交换俩队列
    2、弹出,返回栈顶元素,判断是否为空直接判断队列A就可以

    class MyStack {
    public:
        queue<int> queue1;
        queue<int> queue2;
    
        MyStack() {}
    
        void push(int x) {
            queue2.push(x);
            while (!queue1.empty()) {
                queue2.push(queue1.front());
                queue1.pop();
            }
            swap(queue1, queue2);
        }
    
        int pop() {
            int r = queue1.front();
            queue1.pop();
            return r;
        }
    
        int top() {
            int r = queue1.front();
            return r;
        }
    
        bool empty() {
            return queue1.empty();
        }
    };
    
    0 赞同 0 条回复
  • 浅夏的无奈 普通 2022年10月25日 下午9:24

    时间复杂度:O(n)
    空间复杂度:O(n)

    class MyStack {
        Queue<Integer> q1;
        Queue<Integer> q2;
        public MyStack() {
            q1 =new LinkedList<Integer>();
            q2 =new LinkedList<Integer>();
        }
    
        public void push(int x) {
            q2.offer(x);
            while(!q1.isEmpty()){
                q2.offer(q1.poll());
            }
            Queue<Integer> tmp = q1;
            q1=q2;
            q2=tmp;
        }
    
        public int pop() {
            return q1.poll();
        }
    
        public int top() {
            return q1.peek();
        }
    
        public boolean empty() {
            return q1.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • So 普通 2022年10月25日 下午9:00

    第四天第二题

    class MyStack {
        Queue queue;
        public MyStack() {
            queue = new LinkedList();
        }
    
        public void push(int x) {
            int n = queue.size();
            queue.offer(x);
            for (int i = 0; i < n; i++) {
                queue.offer(queue.poll());
            }
        }
    
        public int pop() {
            return queue.poll();
        }
    
        public int top() {
            return queue.peek();
        }
    
        public boolean empty() {
            return queue.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();
     */
    
    0 赞同 0 条回复
  • Whatever 永久会员 2022年10月25日 下午8:39

    q1为存储队列,q2为辅助队列,将新元素存入q2,再将旧元素逐个存入q2,最后交换队列,保证q1元素正确

    class MyStack {
        Queue<Integer> q1,q2;
        public MyStack() {
            this.q1 = new LinkedList<>();
            this.q2 = new LinkedList<>();
        }
    
        public void push(int x) {
            q2.offer(x);
            while(!q1.isEmpty()){
                q2.offer(q1.poll());
            }
            Queue<Integer> temp = q1;
            q1 = q2;
            q2 = temp;
        }
    
        public int pop() {
            return q1.poll();
        }
    
        public int top() {
            return q1.peek();
        }
    
        public boolean empty() {
            return q1.isEmpty();
        }
    }
    
    0 赞同 0 条回复
  • 波波_1936 普通 2022年10月25日 下午8:35
       //只有在pop和top的时候获取list最后一个元素处理,存储按照队列处理
            //时间复杂度O(n)
            //空间复杂度O(n)
        class MyStack {
            private Queue<Integer> queue;
    
            public MyStack() {
                queue = new LinkedList<Integer>();
            }
            public void push(int x) {
                queue.add(x);
            }
            public int pop() {
                if (queue.isEmpty()) {
                    return -1;
                }
                List<Integer> list = new ArrayList<>();
                while (!queue.isEmpty()){
                    list.add(queue.poll());
                }
                int res = list.get(list.size()-1);
                list.remove(list.size()-1);
                queue.addAll(list);
                return res;
            }
            public int top() {
                if (queue.isEmpty()) {
                    return -1;
                }
                List<Integer> list = new ArrayList<>();
                while (!queue.isEmpty()){
                    list.add(queue.poll());
                }
                int res = list.get(list.size()-1);
                queue.addAll(list);
                return res;
            }
    
            public boolean empty() {
                return queue.isEmpty();
            }
        }
    
    
    0 赞同 0 条回复
  • 易水寒 永久会员 2022年10月25日 下午7:46

    //一个队列

    class MyStack {
        Queue<Integer> q;
        public MyStack() {
            q = new LinkedList<>();
        }
    
        public void push(int x) {
            q.add(x);
            for (int i = 0; i < q.size()-1; i++) {
                q.add(q.remove());
            }
        }
    
        public int pop() {
            return q.remove();
        }
    
        public int top() {
            return q.peek();
        }
    
        public boolean empty() {
            return q.isEmpty();
        }
    }
    
    0 赞同 0 条回复

# 回答此问题

后才能回答