数据结构课件ppt第三章-1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
wk.baidu.com
GetTop(S, &e)
初始条件:栈 S 已存在且非空。 操作结果:用 e 返回 S 的栈顶元素。
a1 a2
……
an
ClearStack(&S) 初始条件:栈 S 已存在。 操作结果:将 S 清为空栈。
Push(&S, e) 初始条件:栈 S 已存在。 操作结果:插入元素 e 为新 的栈顶元素。
}
Status Push (SqStack &S, SElemType e) { if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间 S.base = (SElemType *) realloc ( S.base, (S.stacksize + STACKINCREMENT) * sizeof (SElemType)); if (!S.base) exit (OVERFLOW); //存储分配失败 S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } s.top *S.top++ = e; s.top return OK; c }
栈顶指针
an
an-1
a1 ∧
顺 序栈
top F E top D C top base base B A base C B A
top:栈顶指针,始终指向栈顶元素的下一个位置。 栈顶指针,始终指向栈顶元素的下一个位置。 栈顶指针 base:栈底指针,始终指向栈底的位置,base=NULL,栈不存在。 :栈底指针,始终指向栈底的位置, = ,栈不存在。 base==top,栈空。 ,栈空。
Status InitStack (SqStack &S) {// 构造一个空栈S S.base=(SElemType*)malloc(STACK_INIT_SIZE* sizeof(SElemType)); if (!S.base) exit (OVERFLOW); //存储分配失败 S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK;
b s.base a s.base b a
Status Pop (SqStack &S, SElemType &e) { // 若栈不空,则删除S的栈顶元素, // 用e返回其值,并返回OK; // 否则返回ERROR if (S.top == S.base) return ERROR; e = *--S.top; return OK; }
栈和队列是两种常用的数据类型
3.1 栈的类型定义 3.2 栈的表示与实现 3.3 栈的应用举例 3.4 队列的类型定义 3.5 队列类型的实现
3.1 栈的类型定义
ADT Stack { 数据对象: 数据对象 D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } 数据关系: 数据关系 R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n } 约定an 端为栈顶,a1 端为栈底。 基本操作: 基本操作: } ADT Stack
链栈
top
栈顶 栈底
an
an-1
a1 ∧
注意: 注意 链栈中 指针的方向
链栈是动态分配元素存储空间, 链栈是动态分配元素存储空间, 元素的插入删除操作都是在表 的同一端进行, 的同一端进行,头指针就是栈 顶指针。 顶指针。
3.2 栈的表示和实现
栈的定义 栈的几个基本操作的实现
Status InitStack (SqStack &S) Status Push (SqStack &S, SElemType e) Status Pop (SqStack &S, SElemType &e)
操作结果:构造一个空栈 S。
DestroyStack(&S) 初始条件:栈 S 已存在。 操作结果:栈 S 被销毁。
StackEmpty(S) 初始条件:栈 S 已存在。 操作结果:若栈 S 为空栈,则 返回 TRUE,否则FALE。
StackLength(S) 初始条件:栈 S 已存在。 操作结果:返回 S 的元素个数, 即栈的长度。
a2
栈底
a1 栈只能在栈顶进行插入删除等操 作,按照后进先出的原则。
队列:队尾进行插入操作, 队头进行删除操作。
栈、队列与线性表的插入、删除 操作对比
线性表 栈 队列
Insert(L, i, x) Insert(S, n+1, x) Insert(Q, n+1, x) 1≤i≤n+1 Delete(L, i) Delete(S, n) Delete(Q, 1) 1≤i≤n
类似于线性表的顺序映象实现, 指向表尾的指针可以作为栈顶指针。 //----- 栈的顺序存储表示 ----#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct { SElemType *base; //构造栈之前和销毁栈之后,base值为 构造栈之前和销毁栈之后, 值为NULL 值为 SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 } SqStack;
第三章 栈和队列
栈和队列是操作受限的线性表,它们 的基本操作是线性表操作的子集。 栈是限定仅在表尾进行插入或删除操 作的线性表。 表尾端成为栈顶,表头端成为栈底。 栈的修改是按后进先出的原则进行, 栈又称为后进先出的线性表。
栈和队列的示意图
出栈 栈顶 进栈
an
. . . 队 头 队 尾 出队列 a1 a2 a3 . . . an 入队列
InitStack(&S) DestroyStack(&S) StackLength(S) StackEmpty(s) GetTop(S, &e) ClearStack(&S) Push(&S, e) Pop(&S, &e) StackTravers(S, visit())
InitStack(&S)
a1 a2 …… an e
Pop(&S, &e)
初始条件:栈 S 已存在且非空。 操作结果:删除 S 的栈顶元素, 并用 e 返回其值。 a1 a2 … … an-1 an
栈的存储方法
顺序栈:利用一组地址连续的 top 存储单元依次存放自栈底到栈 C 顶的数据元素,同时附设指针 B top指示栈顶元素在顺序栈中的 base A 位置。 链栈:头指针指向栈顶元素,每个结点的 指针域指向前一个结点。
s.base s.top C B A s.base s.top C B A
e
相关文档
最新文档