初识数据结构

Posted zmlgo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识数据结构相关的知识,希望对你有一定的参考价值。

数据结构顾名思义就是一堆数据的组织方式,以方便后续的存取和操作,且好的算法离不开高效管理数据的方法。

数据结构的三要素:

1. 数据集合。通过数据对象的本体(如数组和结构体)保存数据

2. 操作。对数据集合的操作,如插入、存取、查找、以及修改等

3. 规则。保证数据集合按照一定规矩来操作、管理和存取,如以何种顺序存取数据元素

 

在此介绍几种线性数据结构:

一、栈(Stack)

说明:用于临时保存数据,且按照后入先出的规则管理数据集合,在许多递归式的数学解题中都可应用栈来实现。

操作:

1. push(x) : 在栈顶部添加元素

2. pop() : 从栈顶取数据

3. isEmpty() : 栈是否为空

4. isFull() : 栈是否已满

用数组实现栈的代码:

技术分享
 1 init()
 2     top = 0
 3 
 4 isEmpty()
 5     return top == 0
 6 
 7 isFull()
 8     return top >= Max -1
 9 
10 push(x)
11     if isFull()
12         error(overwrite)
13     S[++top] = x 
14 
15 pop()
16     if isEmpty()
17         error(overread)
18     return S[top--]
View Code

 

二、队列(Queue)

说明:队列是一个等待处理的数据行列,当希望按照数据抵达的先后顺序来处理数据时会用到,其按照先入先出的规则管理数据。在许多消息队列或消息系统中都有所应用,往往作为两个系统或进程间的数据缓冲区,可实现较好的用户体验。

操作:

1. enqueue(x) : 在队列末尾添加元素

2. dequeue() : 从队头中取出元素

3. isEmpty() : 队列是否空

4. isFull() : 队列是否满

队列可区分为线形和环形,但是线形的队列容易导致部分空间被浪费(因每次从队头中取元素使得head加1,若要防止这一情况需让head时常保持在0,即每次执行完dequeue后应让数据整体向数组开头移动,但这将增加复杂度),而环形队列能有效避免该问题。

环形缓冲区由一维数组构成,指示队列范围的head和tail指针在超出数组范围时重新从数组开头开始循环,即如果指针加1之后超出了数组范围,就重新置为0,其代码实现如下:

技术分享
 1 init()
 2     head = tail = 0
 3 
 4 isEmpty()
 5     return head == tail
 6 
 7 isFull()
 8     return head == (tail + 1) % MAX
 9 
10 enqueue(x)
11     if isFull()
12         error(overwrite)
13     Q[tail] = x
14     if tail + 1 = MAX
15         tail = 0
16     else
17         tail++
18 
19 dequeue()
20     if isEmpty()
21         error(overread)
22     x = Q[head]
23     if head + 1 = MAX
24         head = 0
25     else
26         head++
27     return x
View Code

 

三、链表(List)

链表主要由结构体来实现,在C++中即由多个节点(node)来构成,每个节点由指针域和数据域组成,能够高效的在链表特定位置进行插入或删除操作,同时避免内存空间浪费(需要多少就申请多少)。此外,链表基本数据结构是实现高等数据结构的基础。

链表有许多不同的形式,如单向链表、双向链表、环形链表以及多个前驱或后驱节点的链表。在此仅介绍双向链表

 

以上是关于初识数据结构的主要内容,如果未能解决你的问题,请参考以下文章

Java初识方法

初识OpenGL 片段着色器(Fragment Shader)

初识OpenGL 片段着色器(Fragment Shader)

初识OpenGL (-)纹理(Texture)

初识OpenGL (-)纹理(Texture)

初识OpenGL (-)纹理(Texture)