第二章 表、栈和队列

  1. 表ADT
    1. 表的简单数组实现
      1. 表的扩展
      2. int  []arr= new int [10];
        int [] newArr=new int [arr.length*2];
        for(int i=0;i<arr.length;i++)  newArr[i]=arr[i];
        arr=newArr;
    2. 简单链表
  2. Java Collection API中的表
    1. Collection接口:集合的概念在Collection接口中得到抽象,它存储一组类型相同的对象
    2. Iterator接口:通过Iterator方法,每个集合均可创建并返回给客户一个实现Iterator接口的对象,并将当前位置概念在对象内部存储起来
      1. 实现Iterator接口的集合必须提供一个称为iterator的方法,该方法返回一个Iterator类型的对象
      2. 如果对正迭代的集合进行结构上的改变,如删除插入等,那么迭代器不再合法
    3. List接口:继承了Collection接口;
      1. ArrayList类:可增长数组
        1. 初次使用数组开辟容量空间为10
        2. 如果添加操作达到容量,那么将进行1.5倍扩容,创建新数组,将旧的拷贝进去。因为泛型数组创建是非法的,可以创建一个泛型类型界限的数组,然后是用一个数组进行类型转换
          1.   
            AnyType []theItems;
            AnyType []old=theItems;
            theItems =(AnyType []) new Object [newlength];
        3.  int newCapacity = oldCapacity + (oldCapacity >> 1);
        4. 在删除操作中,对提供的索引,将索引后部分对前一个进行覆盖
          1. System.arraycopy(elementData, index+1, elementData, index,numMoved);
        5. 迭代器是一个内部类并存储当前位置和一个链接到MyArrayList的隐式链
        6.  
      2. LinkedList类:双链表实现,
        1. 该链表可以直接在表头表尾直接插入
        2. 可作为堆栈队列使用
    4. 栈ADT
      1. Stack
      2. 栈的是实现可以是链式结构和数组结构
      3. 需要一个时刻指向栈顶的指针
      4. 先入后出的特点,使得无论入栈还是出栈都是对栈顶操作
      5. 应用:
        1. 平衡符号,判断字符串中的括号的否合法存在
        2. 后缀表达式:当一个后缀表达式给出时,不需要知道它的计算规则
          1. 遇见数字就入栈,遇到符号就弹出两个数字进行计算在入栈
        3. 中缀到后缀的转换
          1. 定义一个栈来存储符号,包括括号
          2. 对原中缀表达式进行遍历,遇见数字就输出
          3. 如果遇见左括号,那么左括号进栈,直到遇见一个右括号才弹出
          4. 如果遇见其他加减乘除符号时候,要比较优先级,
            1. 如果栈为空就入栈,
            2. 如果不为空就比较栈顶符号和当前符号的优先级
              1. 如果当前比栈顶高,入栈
              2. 否则出栈,直达发现比当前低的。或者是左括号。然后在把本符号进栈
        4. 递归是栈的一种实现
          1. 为了防止栈空间用尽导致递归失控,避免使用尾递归
          2. 尾递归涉及在最后一行的递归调用,而在之前的内存得不到释放,存储在内部栈里,更容易导致栈溢出
    5. 队列ADT
      1. Queue
      2. 先进先出的结构使得队列需要指向队头和队尾的两个指针
 
 
 
posted @ 2020-04-19 21:45  浪波激泥  阅读(105)  评论(0)    收藏  举报