Learning Data Structure_2_线性表、栈和队列

一个人在学校的日子有些寂寞,但是st说男人要耐得住寂寞,做学问也是如此吧。今天看了线性表、栈和队列的内容。以下是学习记录。

线性表(list)

1.定义:0个或多个数据元素的有限序列,元素有且只有一个直接后继和一个直接前驱;基本操作ListLength、GetElem、LocateElem、ListInsert等,并集Union的实现。

2.线性表的顺序存储结构

指用一段地址连续的存储单元依次存储数据元素(c语言中用数组实现改结构);数组长度>=线性表的长度;对于任意位置的存入或取出的所需时间相同O(1):随机存储结构

顺序结构的插入与删除的算法实现(注意考虑异常的判断),整体移动,平均(n-1)/2,时间复杂度O(n);顺序结构的优点:快速存取,无需指针的开销;缺点:移动大量的元素,难以确定线性表的空间容量。

3.线性表的链式存储结构

改进顺序结构的缺点;由结点(Node)构成,每个结点分为数据域和指针域;头指针和头结点的区别。

单链表的插入(修改p和p->next指针),malloc:生成一个新的结点;结点的删除,free。单链表的整表创建,头插法和尾插法,单链表整表删除;查找:顺序O(1),单链O(n);插入删除:顺序O(n),单链O(1)。

静态链表:用数组(每个数组元素由data和cur游标组成)描述的链表,用游标cur和数组下标实现指针的功能;适用于没有指针的高级语言实现单链表结构。

循环链表:将单链表中的终端结点由空指针改为指向头结点;与单链的区别:p->next为空或者指向头结点来终止循环。

双向链表:在单链的结点中再设指向前驱结点的指针域。

栈(stack)

1.定义:是限定只在表尾(栈顶top)插入和删除的线性表,即LIFO的线性表。

2.栈的插入(进栈、压栈 push);栈的删除(出栈、弹栈 pop);空栈:top == -1。

3.栈的顺序存储结构

空栈:top == -1;push和pop的实现通过修改栈顶指针top来实现;一个数组存储两个栈,分别在数组两端,栈空与栈满(两个栈顶指针相差1),要求两个栈的空间需求有相反关系时运用此数据结构有意义。

4.栈的链式存储结构

栈链:不需要头节点,栈空top = NULL;push和pop操作通过修改top指针实现;若元素个数变化大则用链栈,反之则用顺序栈。

5.栈的应用——递归:必须有递归的终止条件;递归算法是选择结构,易读和理解,但大量的递归调用会建立大量的函数副本,耗时间和内存;迭代是循环结构。

栈的应用——四则运算(后缀、逆波兰表示法):中缀表达式(标准四则运算)与中缀表达式的转换与计算。

队列(queue)

1.定义:是只允许在一端(队尾)插入,在另一端(队头)删除的线性表,即FIFO的线性表。

2.队列的顺序存储结构

一般的顺序存储存在假溢出的问题,对其改进得到循环队列(首位相连的顺序存储结构队列);循环队列满条件:(rear+1)%QueueSize == front(保留一个元素空间),循环队列长度公式:(raer-front+QueueSize)%QueueSize;循环队列的插入与删除操作的算法实现;循环队列缺点:数组可能溢出。

3.队列的链式存储结构

简称链队列,就是线性表的单链表(只能尾进头出而异);队满和队空的判断;入队(改rear指针)与出队(改front指针)操作的算法实现

4.循环队列必须有一个固定长度,可能存在浪费;链队列不存在这个问题,但会增加指针存储的空间开销。

Learning Data Structure_2_线性表、栈和队列

时间: 2024-10-21 19:30:35

Learning Data Structure_2_线性表、栈和队列的相关文章

2 限定性线性表——栈与队列

1 栈与队列     1.1 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数 在该栈中,调用min.push和pop方法 要求时间复杂度均为O(1) 算法思想: 要求时间复杂度均为 O(1),增加辅助空间实现,即增加一个辅助栈存储min值 例如:data 中依次入栈 5, 4, 3, 8, 10, 11, 12, 1, 则 min 中依次入栈 5, 4, 3,no,no, no, no, 1. no 代表此次不如栈,如果入栈的元素小于等于 min 中的栈

数据结构_线性表_顺序队列_循环队列_链队列

个位看官,由于队列操作相对简单,我啥也不多说,直接上代码,欢迎验证!!! #pragma mark --abstract //队列(queue)是只允许在表的一端进行插入,在表的另一端进行删除的线性表,允许插入的一端称为队尾(rear) //允许删除的一端叫做队头(font),不含元素的队列称为空队列 //队列的特点是先进先出(FIFO线性表) #pragma mark --分类 //1.队列的顺序存储结构称为顺序队列(sequential queue),他是由存放队列的一维数组和分别指向队头和

5 线性表-栈-链式存储

头大-- 栈是一种功能受限的线性表 1.基本功能实现 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream> 4 using namespace std; 5 #define TRUE 1 6 #define FALSE 0 7 #define OK 1 8 #define ERROR 0 9 #define OVERFLOW -2 10 #define STACK_INIT_SIZE 100//存储空

2.线性表——栈

1.什么是栈 [1]. 栈是一种只能在一端进行插入和删除操作的线性表:插入:入栈(push):删除:出栈(pop): [2]. 栈是按照“先进后出”(Last In First Out, LIFO)的原则存储数据: 栈顶(Top):允许删除和插入: 栈底(Botton) : [3]. 栈的分类: 静态栈:其核心是数组,类似于一个连续内存的数组,需要提前确定好栈的大小: 动态栈:其核心是链表,内存够用的前提下,可以无穷大,不连续: [4]. 栈的表示: 1.1 栈的表示 2. 栈的基本操作 [1]

数据结构和算法学习总结04 线性表---栈

栈 栈(Stack)是特殊的线性表,是只允许在一端进行插入和删除的线性表. 允许插入和删除的叫栈顶,反之则是栈底. 栈的插入称为进栈,删除称为出栈. 特性是:后进先出,所以栈也叫后进先出表,简称LIFO表(Last In First Out). 因为栈是线性表,所以也有顺序表和链表两种形式,一般我们常用顺序表. 从代码中可以看出:与顺序表相比实际上就是插入和删除操作发生了改变. #include <iostream> using namespace std; const int Stack_S

数据结构和算法分析(9)表栈和队列的实际应用(一)

    在接下来的几篇博文中,将介绍表.栈.队列在编程实践中的应用.     (1)表达式求值:     输入一个中缀表达式,操作符包括(+ - * / ^).转化为后缀表达式之后并计算表达式的值: 要求: 1.输入的中缀表达式必须是一个完整的字符串: 2.不限制数字的位数和正负,负数用()括起来: 代码如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define EmptyT

数据结构和算法分析(10)表栈和队列的实际应用(二)

    本节继续介绍表.栈.队列在编程实践中的应用.     (1)行编辑程序:(允许用户输入出差错,并在发现错误时可以及时更正.)     功能:接受用户从终端输入的字符型的数据,并存入用户的数据区.由于不能保证不出差错,因此“每接受一个字符即存入用户数据区”的做法不是最恰当的:较好的做法是,设立一个输入的缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区. 算法原理:当用户发现刚刚键入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效:如果发现当前键入的行内差错较多或者

数据结构-线性表-栈

栈:后进先出(LIFO) last in first out栈是一种特殊的线性表,只能在线性表的一端进行操作.栈顶 top栈底 bottom 实现方式:顺序结构实现,线性结构实现 链式存储实现 LinkStack.h #ifndef _LINKSTACK_H_ #define _LINKSTACK_H_ typedef void LinkStack; LinkStack* LinkStack_Create(); void LinkStack_Destroy(LinkStack* stack);

[Data Structure]线性表Linear List2

目录 线性表 链接表(链表) 表的实现--链接表 单链表 单链表操作:加入元素 单链表操作:删除元素 单链表的实现:几个基本操作 单链表的实现:尾端加入 单链表实现:首/尾端弹出 单链表实现:其他操作 单链表的变形 单链表的变形:带尾节点引用 线性表 链接表(链表) 线性表实现的基本需要: 能够找到表中的首元素(无论直接或间接,通常很容易做到) 从表里的任一个元素出发,可以找到它之后的下一个元素 显然,把表元素保存在连续的存储区里,自然满足这两个需求,顺序关联是隐含的.但满足这两种需求,并不一定