zoukankan      html  css  js  c++  java
  • 数据结构学习笔记_表

    表 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

  • 相关阅读:
    _getch()函数的一些使用方法
    键盘敲击(keyboard hit)
    计时 GetTickCount() 函数的作用和用法
    1
    关于COLORREF的定义及用法
    C++字符串大小写转换的库函数
    数楼梯(斐波那契数列+高精度)
    回文数(内含高精度加法,字符串是否为回文的判断)
    最短路径Dijkstra算法
    经典八大排序
  • 原文地址:https://www.cnblogs.com/coloz/p/11052017.html
Copyright © 2011-2022 走看看