- 2
- 0
- 约4.96千字
- 约 27页
- 2017-06-08 发布于湖北
- 举报
线性表 堆栈
顺序表和链表的比较 本章介绍了线性表的逻辑结构及它的两种存储结构:顺序表和链表。 顺序存储有3个优点: (1) 方法简单,各种高级语言中都有数组,容易实现。 (2) 不用为表示结点间的逻辑关系而增加额外的存储开销。 (3) 顺序表具有按元素序号随机访问的特点。 栈的实例 举例1:家里吃饭的碗,通常在洗干净后一个一个地叠在一起存放(相当于入栈),在使用时,若一个一个地拿(相当于出栈),一定最先拿走最上面的那只碗,而最后拿出最下面的那只碗。 举例2:存放货物的货栈也是一种栈结构,货物入库时,总是将货物从底层开始一层一层地堆上去(相当于入栈),货物出库时,只能将货物从顶端一层一层地搬出(相当于出栈)。 1、用数组实现栈(顺序栈) 3.4 栈的应用举例 【举例1】数制转换问题:将十进制正整数n转换为八进制的数。(用数组实现) The End! 第*页 第2章 基本线性结构 堆栈 1、单链表 小 结 * 小 结 顺序存储两个缺点: ⑴ 在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低。 ⑵ 需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。 链表的优缺点恰好与顺序表相反。 在实际中怎样选取存储结构有以下几点考虑: ⒈ 基于存储的考虑 对线性表的长度或存储规模难以估计时,不宜采用顺序表; 链表不用事先估计存储规模,但链表的存储密度较低。 ⒉ 基于运算的考虑 如果经常做的运算是按序号访问数据元素,顺序表优于链表; 在顺序表中做插入、删除操作时平均移动表中一半的元素,在链表中作插入、删除操作,虽然也要找插入位置,但操作主要是比较操作,从这个角度考虑后者优于前者。 ⒊ 基于环境的考虑 顺序表容易实现,任何高级语言中都有数组类型,链表的操作是基于指针的,相对来讲前者简单些,也是用户考虑的一个因素。 总之,两种存储结构各有长短,选择那一种由实际问题中的主要因素决定。通常“较稳定”的线性表选择顺序存储,而频繁做插入删除的即动态性较强的线性表宜选择链式存储。 2.5.1 堆栈的定义及基本运算 堆栈是限制在表的一端进行插入和删除的线性表。允许插入、删除的这一端称为栈顶,另一个固定端称为栈底。当表中没有元素时称为空栈。 2.5 堆栈 * 图 3-1 an a1 a2 ……... 栈底 栈顶 ... 出栈 进栈 栈 s=(a1,a2,……,an) 栈顶(top):允许插入和删除的一端; 栈底(bottom):不允许插入和删除的一端。 特点:在任何时候操作的元素都是栈顶元素,也就是栈的修改按后进先出的原则进行,因此,栈又称后进先出表,简称LIFO表。 堆栈的基本运算: ⑴栈初始化:Init_Stack(s) ⑵判栈空:Empty_Stack(s) ⑶入栈: Push_Stack(s,x) ⑷出栈:Pop_Stack(s) ⑸读栈顶元素:Top_Stack(s) * 2.5.2 栈的存储及运算实现⒈顺序栈 和顺序表相似,顺序栈的类型描述如下: #define MAXSIZE 100 typedef struct { datatype data[MAXSIZE]; int top; }SeqStack; 定义一个指向顺序栈的指针: SeqStack *s; 通常0下标端设为栈底,栈顶指针top值为-1,表示空栈 * top=-1 1 2 3 4 5 0 栈空 栈顶指针top,指向实际栈顶位置,初值为-1 top 1 2 3 4 5 0 进栈 A top 出栈 栈满 B C D E F 设数组容量为M top=-1,栈空,此时出栈,则下溢 top=M-1,栈满,此时入栈,则上溢 top top top top top 1 2 3 4 5 0 A B C D E F top top top top top top 栈空 ⑴ 置空栈 首先建立栈空间,然后初始化栈顶指针。 * SeqStack *Init_SeqStack() { SeqStack *s; s=(SeqStack *)malloc(sizeof(SeqStack)) ; if(!s) { printf(空间不足\n); return NULL; } s-top=-1;
原创力文档

文档评论(0)