• 【剑指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();
        }
    }
    
  • 相关阅读:
    cmanformat
    mysql-sql语言参考
    jQuery 判断多个 input checkbox 中至少有一个勾选
    Java实现 蓝桥杯 算法提高 计算行列式
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
  • 原文地址:https://www.cnblogs.com/gzshan/p/10730367.html
Copyright © 2020-2023  润新知