java学习6

136 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

链队列

1 队列特点

队列相比于栈,它是两端都可以操作,但队头只能进行出队列,队尾只能进行入队列(就像生活中的排队买东西一样)在删除队列时,需要注意判断队列是否为空(如下代码:header.next == null)。当对头(header)和队尾(tail)指向同一个节点时,则队列为空 ,所以空队列也需要一个节点

public int dequeue () {
        if (header == tail) {
            return -1;
        }
        Node node = header.next;
        header.next = header.next.next;
 
        // The queue becomes empty.
        if (header.next == null) {
            tail = header;
        }
        return node.data;
    }

在删除时,若没有判断队列是否为空,会报空指针异常

image.png 正常:

image.png

循环队列

循环队列思路(结合下图):

(1)队满:(rear + 1) % MAX_SIZE = front; 队空:front = rear

(2) 入队:判断队是否已满再入队(顺序:先入值再修改指针);出队:判断队是否为空再出队(顺序:先出值再修改指针)

在写代码中,正是需要注意这些细节,不然会报bug

image.png

取模

出队头指针加1,入队尾指针加1,头/尾指针不做任何处理,则会一直无限制向上加,但循环队列最大长度假设只有MAX_SIZE=10,则头/尾指针会出现溢出,取模则可以使头/尾指针做循环。所以在写代码时要考虑数组越界问题。

字符串匹配

字符串匹配,将子串和主串进行匹配。若子串和主串不匹配,则主串从下一个字符开始与子串重新开始匹配,直到多次匹配结束都无匹配则返回不匹配有则返回地址。这样两个串的“指针”都要回溯。若用KMP,则只需要回溯子串指针。

面向对象与面向过程相比, 有哪些优势?

面向过程我们主要放在操作步骤上,如之前写的“矩阵相加”,而这个类主要就是完成一个功能及如何完成矩阵相加,MatrixAddition

面向对象:例如之前写了一个链表类,我们把链表类抽象为一个类对象,在这个对象有自己的变量和方法,实现了查找,插入,删除等功能,当我想用其中任何一个方法,我可以通过对象去调用,当我想用另一个方法时,发现没有,我可以去对象中加,以后也可以复用方法。

所以面向对象更容易扩展修改,更容易模块化,减少代码的冗余。

 分析链队列与循环队列的优缺点.

相比于链队列,循环队列对空间利用率更大,删除后的元素空间还可以再利用,但循环队列大小是提前定义好了,不像链队列能动态增加。

 对于不同的基础数据类型, 都需要重写一个类, 这样合理吗? 你想怎么样

这样不合理,不满足面向对象思想。可以使用泛型。但我使用Object类型来实现,因为Object类是所以类的超类,并试用int和char类型都可以满足,但正因为Object类任何类型都能接收,可能会在运行中出现bug。

 
    Object[] data;
 
    //The index for calculating the head
    int head;
 
    //The index for calculating the tail
    int tail;
 
    public CircleQueue () {
        data = new Object[TOTAL_SPACE];
        head = 0;
        tail = 0;
    }