数据结构与算法(六)队列 - 数组队列+链表队列

public class Queue {

    @Test
    public void test() {
        //均摊时间复杂度O(1)
//        ArrayQuene arrayQuene = new ArrayQuene();
//        arrayQuene.enqueue(1);
//        arrayQuene.enqueue(2);
//        arrayQuene.enqueue(3);
//        arrayQuene.show();
//        System.out.println("===================" + arrayQuene.outqueen());
//        System.out.println("===================" + arrayQuene.outqueen());
//        arrayQuene.enqueue(4);
//        arrayQuene.enqueue(5);
//        arrayQuene.enqueue(6);
//        arrayQuene.show();
//        System.out.println("===================" + arrayQuene.outqueen());
//        arrayQuene.show();
//        arrayQuene.enqueue(11);
//        arrayQuene.enqueue(22);
//        System.out.println("===================" + arrayQuene.outqueen());
//        arrayQuene.show();
//        System.out.println("===================" + arrayQuene.outqueen());
//        System.out.println("===================" + arrayQuene.outqueen());
//        System.out.println("===================" + arrayQuene.outqueen());
//        arrayQuene.show();

        //还是链表实现更爽一点,毕竟不用像数组那样,考虑移位、扩容
        LinkedQueue linkedQueue = new LinkedQueue();
        linkedQueue.enqueue(1);
        linkedQueue.enqueue(2);
        linkedQueue.enqueue(3);
        linkedQueue.show();
        System.out.println("===================pop " + linkedQueue.outqueue());
        System.out.println("===================pop " + linkedQueue.outqueue());
        linkedQueue.enqueue(44);
        linkedQueue.enqueue(55);
        linkedQueue.show();

    }

    class ArrayQuene {
        int[] array = new int[4];
        double factor = 0.75;
        int head = 0;
        int tail = 0;

        public void enqueue(int value) {
            //尾部超过整体数组一定长度后扩容
            if (tail > array.length * factor) {
                //长度翻倍
                int[] arrayTemp = new int[array.length * 2];
                //head到tail移动过去
                for (int i = 0; i < tail - head; i++) {
                    arrayTemp[i] = array[head + i];
                }
                tail = tail - head;
                head = 0;
                //赋值
                array = arrayTemp;
            }
            if (tail < array.length) {
                array[tail] = value;
                tail++;
            }

        }

        public int outqueen() {
            int value = 0;
            if (head < tail) {
                value = array[head];
                head++;

                //如果超过一半的空间未利用,则发起位置移动
                if (head > array.length / 2) {
                    //整体向前移动head-1位,这里-1是因为上面刚刚执行过head++
                    for (int i = head - 1; i < tail; i++) {
                        array[i - (head - 1)] = array[i];
                    }
                    tail = tail - (head - 1);
                    head = 0;
                }
            }
            return value;
        }

        public void show() {
            for (int i = head; i < array.length; i++) {
                System.out.println("==============[" + array[i] + "] in " + array.length);
            }
        }
    }

    class LinkedQueue {
        Node head = null;

        public void enqueue(int val) {
            Node temp = new Node(val);
            if (head == null) {
                head = temp;
                return;
            }
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = temp;
        }

        public int outqueue() {
            if (head == null) {
                return 0;
            }

            int val = head.val;
            head = head.next;
            return val;
        }

        public void show() {
            Node current = head;
            while (current != null) {
                System.out.println("==================" + current.val);
                current = current.next;
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值