zoukankan      html  css  js  c++  java
  • 两个队列实现一个栈

    队列是先进先出,栈是后进先出
    如何使用队列实现栈?
    首先,需要多少个队列?一个肯定是不行的,但是两个就足够了。

    分析

    假设有队列 q1,q2
    初始想法是利用 q2把q1反向,形成后来的在队尾,但是由于队列的方向是固定的,
    不论你怎么摆弄,都不可能反向:一个队列出去的,也必定先进入另一个队列——顺序始终不变
    现在考虑:不反向,push进去的顺序不要管,只需要关系pop、peek
    具体实现:push时只向一个队列添加,维持一个队列为空
    -pop时,把当前队列的前size-1个元素放到另一个空队列,本队列清空
    -peek时,返把所有元素放到另一个队列,同时返回最后一个,本队列清空

    实现

    public class TwoQueueAsStack {
        private Queue<Integer> q1 ; //q1,q2用于存放元素,保持其中一个为空
        private Queue<Integer> q2 ;
        private Queue<Integer> cur; //cur和empty指向q1/q2,用户具体的操作
        private Queue<Integer> empty;
    
        public TwoQueueAsStack(){
            q1 = new LinkedList<>();
            q2 = new LinkedList<>();
        }
        //调整队列,使cur指向q1q2中用于存放元素的队列,empty指向空队列
        private void adjust(){
            cur  =q1.size()==0?q2:q1;
            empty=q1.size()==0?q1:q2;
        }
    
        public void push(int a){
            adjust();
            cur.offer(a);
        }
        public boolean pop(){
            adjust();
            if (cur.size()==0)return false; //为空
            while (cur.size()!=1){
                empty.offer(cur.poll());
            }
            cur.poll();
            return true;
        }
        public int peek(){
            adjust();
            if (cur.size()==0){
                System.out.println("empty");//为空
                return -1;
            }
            while (cur.size()!=1){
                empty.offer(cur.poll());
            }
            int res = cur.poll();
            empty.offer(res);
            return res;
        }
        public int size(){
            return Math.max(q1.size(),q2.size());
        }
        
        public static void main(String[] args) {
            TwoQueueAsStack tqa =  new TwoQueueAsStack();
            tqa.push(1);
            tqa.push(2);
            tqa.push(3);
            System.out.println(tqa.size());
            System.out.println(tqa.peek());
            tqa.pop();
            tqa.pop();
            System.out.println(tqa.peek());
            System.out.println(tqa.size());
        }
    }
    
  • 相关阅读:
    把文本数据转化为json
    componentsSeparatedByString 的注意事项
    内存管理
    审核问题2.3.1
    H5缩放效果的问题和缓存问题
    iOS库
    DDOS 攻击防范
    连接数过多的问题
    nginx 长连接keeplive
    javascript 判断身份证的正确性
  • 原文地址:https://www.cnblogs.com/XT-xutao/p/12786623.html
Copyright © 2011-2022 走看看