暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据结构中的线性结构

热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多宝贵地意见,我们一起提升,守住自己的饭碗。

正文开始

 数据结构是指数据元素的集合及元素间的相互关系和构造方法,结构就是元素之间的关系。
在链式存储结构中,结点大小的选择和顺序存储方法中数组空间大小的选择一样重要,它直接影响对串处理的效率。
通常情况下,字符串存储在一维字符数组中,每个字符串的末尾都有一个串结束符,在C/C++程序中以特殊字符“\0”作为结束标记。
3.字符串运算
大多数的程序语言在其开发资源包中都提供了字符串的赋值(拷贝)、连接、比较、求串长、求子串等基本运算,利用它们就可以实现关于串的其他运算。

 

 

 

 

 

 

一、数据结构概述

数据结构是研究数据元素集合及其相互关系与构造方法的学科。其中:

  • • 逻辑结构描述元素间抽象关系,分为线性结构和非线性结构
  • • 存储结构实现数据的物理存储方式,主要包含顺序存储和链式存储

线性结构包括线性表、栈、队列、串,非线性结构主要有树和图。本文重点解析线性结构的核心内容。

二、线性表

1. 基本概念

线性表是n个数据元素组成的有限序列,主要操作包括插入、删除和查找。

2. 存储结构对比

存储方式
特点
优点
缺点
适用场景
顺序存储
连续内存空间
随机访问O(1)
插入/删除需移动元素
静态数据集
链式存储
结点离散存储
动态扩容,插入/删除O(1)
顺序访问O(n)
动态变化数据

衍生链表结构:

  • • 双向链表:包含前驱/后继指针,支持双向遍历
  • • 循环链表:尾结点指向头结点,形成环形结构
  • • 静态链表:利用数组模拟链式结构

三、栈与队列

1. 栈(LIFO结构)

核心操作

class Stack:
    def __init__(self):
        self.items = []
    
    def push(self, item):  # 入栈
        self.items.append(item)
    
    def pop(self):         # 出栈
        return self.items.pop()
    
    def peek(self):        # 查看栈顶
        return self.items[-1]

存储实现

  • • 顺序栈:数组+栈顶指针(需处理上溢)
  • • 链栈:头插法链表(无容量限制)

典型应用

  • • 表达式求值:中缀转后缀表达式
  • • 括号匹配验证
  • • 函数调用栈

2. 队列(FIFO结构)

循环队列实现

#define MAXSIZE 100
typedef struct {
    int data[MAXSIZE];
    int front, rear;
} CircularQueue;

void enQueue(CircularQueue *q, int x) {
    q->rear = (q->rear+1) % MAXSIZE;
    q->data[q->rear] = x;
}

特殊队列类型

  • • 双端队列:两端均可操作
  • • 优先队列:按优先级出队
  • • 阻塞队列:线程安全模型

四、字符串处理

1. 基本概念

  • • 空串:长度0的串(∅)
  • • 子串:主串中连续字符序列
  • • 串相等:长度与内容完全一致

2. 存储优化

// 动态字符串实现示例
class MyString {
    char[] value;
    int length;
    
    public MyString concat(MyString s) {
        char[] newVal = Arrays.copyOf(value, length+s.length);
        System.arraycopy(s.value, 0, newVal, length, s.length);
        return new MyString(newVal);
    }
}

3. 模式匹配算法

  • • Brute-Force:O(mn)时间复杂度
  • • KMP算法:通过部分匹配表优化至O(m+n)

五、应用实践

  1. 1. 文本编辑器:使用栈实现撤销操作
  2. 2. 消息队列:基于循环队列实现生产者-消费者模型
  3. 3. DNA序列分析:通过字符串匹配算法进行基因比对

六、重要考点

  1. 1. 顺序表插入删除元素时的移动次数计算
  2. 2. 链表头结点作用与边界条件处理
  3. 3. 循环队列队空/队满判断条件:
    • • 队空:front == rear
    • • 队满:(rear+1)%MAXSIZE == front

线性结构作为数据结构的基础,其设计思想延伸至非线性结构。理解不同存储结构的实现原理与时空复杂度特性,是进行高效算法设计的关键。

 



END
往期文章回顾

文中的概念来源于互联网,如有侵权,请联系我删除。

欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。



文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论