抽象数据结构与表

作者: 月见樽 | 来源:发表于2017-11-19 14:42 被阅读0次

    抽象数据结构

    抽象数据结构(ADT)是一些操作的集合,集合了一些必要且重用性高的操作,这些操作在一个项目中只被编写一次。抽象数据结构只定义操作的存在,并不定义操作的实现

    概念

    表是一种基础的数据结构,是一系列逻辑上"顺序"的数据(顺序指具有连续的数值索引)。例如$A_{0},A_{1},A_{2}$就是一个表,数据具有连续索引1,2,3。此外,还有前驱元和后继元的概念:

    • 前驱元:某个元素之前的元素被称为该元素的前驱元(不定义第一个元素的前驱元)
    • 后继元:某个元素之后的元素被称为该元素的后继元(不定义最后一个元素的后继元)

    表的实现方法

    • 数组实现:查找快,插入与删除慢,大小固定,内存中一般连续
    • 链表实现:查找较慢,插入与删除相对较快,大小可变,内存中一般不连续

    表需要的方法

    • is_empty:判断是否为空表
    • is_last:判断是否为结尾
    • find:根据值获得在表中的节点(find_previous:获得前驱元)
    • visit:根据位置获得值(find)
    • delete:删除元素
    • insert:插入元素

    实现

    接口与结构体

    //表中数据类型
    type table_data struct {
        data int
    }
    
    //链表节点类型
    type table_node struct {
        data table_data
        next *table_node
    }
    
    //方法接口
    type table_adt interface {
        is_empty() bool
        is_last(node table_node) bool
        size() int
        find(data table_data) *table_node
        find_previous(data table_data) *table_node
        find_last() *table_node
        visit(num int) *table_node
        delete(data table_data)
        insert(data table_data, previous *table_node)
        append(data table_data)
    }
    
    //链表结构体
    type link_table struct {
        head   table_node
        length int
    }
    

    方法的实现

    func (table *link_table) is_empty() bool {
        return table.head.next == nil
    }
    
    func (table *link_table) is_last(node table_node) bool {
        return node.next == nil
    }
    
    func (table *link_table) find(data table_data) *table_node {
        node := table.head.next
        for (node != nil) && (node.data != data) {
            // fmt.Println(node.data, data, (node.data != data))
            node = node.next
        }
        return node
    }
    
    func (table *link_table) find_previous(data table_data) *table_node {
        node := &table.head
        for (node.next.data != data) && (node.next != nil) {
            node = node.next
        }
        return node
    }
    
    func (table *link_table) find_last() *table_node {
        node := &table.head
        for node.next != nil {
            node = node.next
        }
        return node
    }
    
    func (table *link_table) visit(num int) *table_node {
        node := table.head.next
        for i := 0; i < num; i++ {
            node = node.next
        }
        return node
    }
    
    func (table *link_table) delete(data table_data) {
        previous := table.find_previous(data)
        if previous != nil {
            previous.next = previous.next.next
            previous.next.next = nil
        }
        table.length -= 1
    }
    
    func (table *link_table) insert(data table_data, previous *table_node) {
        node := &table_node{data, previous.next}
        previous.next = node
        table.length += 1
    }
    
    func (table *link_table) append(data table_data) {
        last := table.find_last()
        table.insert(data, last)
    }
    
    func (table *link_table) size() int {
        return table.length
    }
    
    //构造函数
    func new_link_table() *link_table {
        head := table_node{table_data{}, nil}
        return &link_table{head, 0}
    }
    

    go笔记

    • go语言的面向对象使用struct实现,方法和属性分开定义
    • 方法的定义是func (a *b) name () [return_type] {}其中(a *b)表示该函数是哪个类型的方法,调用过程中,.运算符将运算符前的变量赋给a,类似于Python中的self和C++中的this指针
    • 接口与C++中接口类似,可用于实现多态,另外如果使用接口访问"对象",可以保护对象的属性和未在接口中声明的方法,实现类似私有方法的功能

    相关文章

      网友评论

        本文标题:抽象数据结构与表

        本文链接:https://www.haomeiwen.com/subject/azauvxtx.html