数据结构学习笔记_表

表 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

 

posted @ 2019-06-20 08:32  将军上座  阅读(206)  评论(0编辑  收藏  举报