表 ADT(抽象数据类型)
一. List (ArrayList 和 LinkedList)
1.remove方法是调整next引用
删除最后一项比较复杂,因为节点只存储后一项节点的链,而最后一项的删除需要找出所有引用最后一项的节点,并将next 设置为null
2.Insert方法需要new 操作符从系统中获取一个新的节点,通过两次调整引用
数组的插入数据,如果是前面的数据插入,要将后面的元素整体后移,开销比较大
3. 双链表:后一节点同时指向前一个节点
二. 栈
1. 栈ADT STACK (LIFO,后进先出)
2. 表的末端叫做top 栈顶
3. 操作有push(进栈) , pop(出栈)即删除最后进入的元素
4. 优点:模仿AyyrayList的add,栈里面推入元素非常快, 弹出一个栈元素也很快.
5. 下面一个简单例子,利用栈校验我们写代码左括号和右括号是否成对匹配.
@Test public void test1() { String codeStr = "{ [aa{a(123123)}]}"; //简单假设这是一段代码 String codeStr2 = "{ [aa{a(12312)3)}]}"; boolean result1 = checkCode(codeStr); boolean result2 = checkCode(codeStr2); System.out.println("result1 :" + result1); //true System.out.println("result2 :" + result2); //false } //校验代码的符号是否成对 public boolean checkCode(String codeStr) { Stack<String> stacks = new Stack<>(); for (int i = 0; i < codeStr.length(); i++) { String character = codeStr.substring(i, i + 1); if (character.equals("{") || character.equals("[") || character.equals("(")) { stacks.push(character); //开放符号,即左边开放符号,压栈 } else if (character.equals(")") || character.equals("]") || character.equals("}")) { //如果栈为空,返回false,不能以右闭符号开头 if (stacks.isEmpty()) { return false; } //弹出栈顶元素,最后的左开括号 String pop = stacks.pop(); //校验是否匹配 if (character.equals(")")) { if (!pop.equals("(")) return false; } else if (character.equals("]")) { if (!pop.equals("[")) return false; } else if (character.equals("}")) { if (!pop.equals("{")) return false; } } } //此时栈中不应该再有左括号 return stacks.isEmpty(); }
6.尾递归
三. 队列
1.队列也是表,先进先出.在一端插入,另一端删除.
2.队列操作有出队dequeue和入队enqueue