• 两个队列实现一个栈


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

    分析

    假设有队列 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());
        }
    }
    
  • 相关阅读:
    关于CG Relighting系统设计的片言碎语
    [F&Q:How To Learn Computer Graphic]如何学习计算机图形学
    以后再也不写英文的文章了
    [D80]天井
    [应邀发布]Rapidmind Development Platform Download
    vs2008 结构体托管
    换实验室
    3D
    【入门】点击按钮添加输入框
    【入门】PHP与数据库连接
  • 原文地址:https://www.cnblogs.com/XT-xutao/p/12786623.html
Copyright © 2020-2023  润新知