zoukankan      html  css  js  c++  java
  • 【剑指Offer】5、用两个栈实现队列

      题目描述:

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

      解题思路:

      本题的基本意图是:用两个后入先出的栈来实现先入先出的队列。对于这个问题,我们可以通过一个实例来进行具体分析。不难得出相应的规律:有两个栈stack1和stack2,每次向队列中插入元素可以都压入到stack1中,当需要从队列中删除元素时,我们应该是删除最早插入的那个(FIFO),这时可以将stack1中的元素逐个弹出并压入stack2,直到stack1为空,这时最早插入的元素就位于stack2的栈顶,可以直接弹出。

      因此,我们总结如下:压入元素时,都压入栈1,当需要弹出时,从栈2弹出,当栈2不为空时直接弹出栈顶元素,为空时将栈1的元素“倒进去”。

      举例:

      编程实现(Java):

    public class Solution {
        Stack<Integer> stack1 = new Stack<Integer>();
        Stack<Integer> stack2 = new Stack<Integer>();
       
        public void push(int node) {
            stack1.push(node);
        }
        
        public int pop() {
            if(stack2.empty()){  //为空时将栈1的元素“倒进去”
                while(!stack1.empty()){
                    stack2.push(stack1.pop());
                }
            }
            return stack2.pop();
        }
    }
    

      扩展:用两个队列实现一个栈

      用两个队列实现栈相比稍微复杂,当插入一个元素时,可以选择不为空的那个队列直接加进去,而当删除一个元素时,需要借助另一个空队列,首先依次删除原队列的头,并将删除的元素加入另一个队列,直到找到队列最后一个元素,将其删除,这时原来的数据队列变空,另一个队列变为数据栈。

    class MyStack {
        Queue<Integer> q1,q2;
        int topValue;
    
        /** Initialize your data structure here. */
        public MyStack() {
            q1=new LinkedList<>();
            q2=new LinkedList<>();
            topValue=0;
        }
        
        /** Push element x onto stack. */
        public void push(int x) {  //压入到不为空的那个队列中
            if(!q1.isEmpty())  
                q1.add(x);
            else
                q2.add(x);
            
            topValue=x;
        }
        
        /** Removes the element on top of the stack and returns that element. */
        public int pop() {
            
            int temp=0;
            while(!q1.isEmpty()){  //q1不空
                temp=q1.poll();
                if(q1.isEmpty())
                    return temp;
                q2.add(temp);
                topValue=temp;
            }
            while(!q2.isEmpty()){  //q1不空
                temp=q2.poll();
                if(!q2.isEmpty()){
                    q1.add(temp);
                    topValue=temp;
                }
            }
            return temp;
        }
        
        /** Get the top element. */
        public int top() {
            return topValue;
        }
        
        /** Returns whether the stack is empty. */
        public boolean empty() {
            return q1.isEmpty() && q2.isEmpty();
        }
    }
    
  • 相关阅读:
    浅谈 倍增/ST表
    Meetings S 题解
    排序模板
    Huffman 树
    2020.7.31 模拟赛 题解
    浅谈 最短路
    【lcez校内第三次考T1】【题解】folder
    【题解】 P2613 【模板】有理数取余
    【题解】P5535 【XR-3】小道消息
    【笔记】积性函数 与 欧拉函数
  • 原文地址:https://www.cnblogs.com/gzshan/p/10730367.html
Copyright © 2011-2022 走看看