双端队列的问题

双端队列的问题

public E getFront(){    if(isEmpty())        throw new IllegalArgumentException("Queue is empty.");    return data[front]; } // 因为是双端队列,我们也有一个 getLast 的方法,来获取队尾元素的值 public E getLast(){    if(isEmpty())        throw new IllegalArgumentException("Queue is empty.");    // 因为 tail 指向的是队尾元素的下一个位置,我们需要计算一下真正队尾元素的索引    int index = tail == 0 ? data.length - 1 : tail - 1;    return data[index]; }


对于getLast和getFront,我有些不理解,这里front和tail不都应该指向对应的元素位置吗,为什么这里需要判断呢?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

tail 并不是指向最后一个元素,而是指向最后一个元素的下一个位置。在课程之前所实现的循环队列中也是如此,再回顾一下课程之前的实现?


所以,要想找最后一个元素,要看 tail 前一个位置的元素,即 tail - 1 位置的元素。但如果 tail 为 0,tail - 1 为负数,此时,前一个位置的元素实际上在 data.length - 1 的位置,所以要做一个判断。


继续加油!:)

  • 正好有人问了相关问题,我就随便在其下说说我的实现方法,希望可以得到老师的检阅。前一节,观看了老师布置的”作业“,像先尝试自己实现下,检验下自己的学习效果。


    我是这样想的:front指向队列中的第一个元素,tail指向队列中的最后一个元素。这样两端的添加和删除元素的操作就统一了。同时,查看的操作的也统一了,符合题主的期待。


    代码如下

    /**
     * 双端队列
     * @author gzn
     * @version 1.0
     */
    
    public class Deque<E>{
    
        private E[] data;
        private int front, tail;
        private int size;
    
        // ... 省略一些方法
        private void resize(int newCapacity){
            E[] newData = (E[])new Object[newCapacity];
            for(int i = 0; i < size; i ++){
                newData[i] = data[(i + front) % data.length];
            }
            data = newData;
            front = 0;
            tail = size - 1;
        }
    
        public void addFront(E e){
            if(size == getCapacity()){
                resize(getCapacity() * 2);
            }
    
            if (data[front] != null){
             //   front = front - 1 >= 0 ? front - 1 : front - 1 + data.length;
                front = front == 0 ? data.length - 1 : front - 1;
            }
            data[front] = e;
            size ++;
        }
        public void addLast(E e){
            if(size == getCapacity()){
                resize(getCapacity() * 2);
            }
    
            if (data[tail] != null){
               tail = (tail + 1) % getCapacity();
            }
            data[tail] = e;
            size ++;
        }
    
        public E  removeFront(){
            if(isEmpty()){
                throw new RuntimeException("RemoveFront failed. Cannot remove from a empty deque.");
            }
            E ret = data[front];
            data[front] = null;
            size --;
            if(!isEmpty()){
                front = (front + 1) % data.length;
            }
    
            if(size == getCapacity() / 4 && getCapacity() / 2 != 0){
                resize(getCapacity() / 2);
            }
            return ret;
        }
        public E removeLast(){
            if(isEmpty()){
                throw new RuntimeException("RemoveLast failed. Cannot remove from a empty deque.");
            }
    
            E ret = data[tail];
            data[tail] = null;
            size --;
            if(!isEmpty()){
                tail = tail - 1 >= 0 ? tail - 1 : tail - 1 + data.length;
            }
            if(size == getCapacity() / 4 && getCapacity() / 2 != 0){
                resize(getCapacity() / 2);
            }
            return ret;
        };
    
        public E getFront(){
            if(isEmpty()){
                throw new RuntimeException("Deque si empty.");
            }
            return data[front];
        }
    
        public E getLast(){
            if(isEmpty()){
                throw new RuntimeException("Deque si empty.");
            }
            return data[tail];
        }
     
        public static void main(String[] args) {
    
            Deque<Integer> deque = new Deque<>(10);
    
            for (int i = 0; i < 10; i ++){
                if(i % 2 == 0){
                    deque.addLast(i);
                    System.out.println(deque);
                    System.out.println("当前添加元素:" + deque.getLast());
                }else{
                    deque.addFront(i);
                    System.out.println(deque);
                    System.out.println("前添加元素: " + deque.getFront());
                }
    
                if(i % 3 == 2){
                    if(i % 2 == 0){
                        deque.removeLast();
                        System.out.println(deque);
                    }else{
                        deque.removeFront();
                        System.out.println(deque);
                    }
                }
            }
    
        }
    }


    2021-10-28 20:44:37
  • 我回复老师的内容,为什么没有显示出来(测试下,看能否显示)

    2021-10-28 20:50:19
  • 这个回复我收到推送了。没有收到其他推送,不排除是因为你的回复触发了什么敏感词,慕课网需要后台审核。

    2021-10-29 01:51:01
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师