第3章栈和队列

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章栈和队列

3.1.2 栈的表示和算法实现
1.顺序栈 2.链栈
第3章栈和队列
1. 顺序栈 顺序栈是用顺序存储结构实现的栈,即利 用一组地址连续的存储单元依次存放自栈 底到栈顶的数据元素,同时由于栈的操作 的特殊性,还必须附设一个位置指针top( 栈顶指针)来动态地指示栈顶元素在顺序 栈中的位置。通常以top=-1表示空栈。
第 3 章 栈和队列
3.1 栈 3.2 队列 3.3 栈和队列的应用
第3章栈和队列
3.1 栈
3.1.1 栈的抽象数据类型定义 3.1.2 栈的表示和算法实现
第3章栈和队列
3.1.1 栈的定义
1.栈的定义 栈(stack)是一种只允许在一端进行插入和删除的线 性表,它是一种操作受限的线性表。在表中只允许进
行插入和删除的一端称为栈顶(top),另一端称为 栈 底 (bottom) 。 栈 的 插 入 操 作 通 常 称 为 入 栈 或 进 栈 (push),而栈的删除操作则称为出栈或退栈(pop)。 当栈中无数据元素时,称为空栈。
栈是按照后进先出 (LIFO)的原则组 织数据的,因此, 栈也被称为“后进 先出”的线性表。
第3章栈和队列
(2)入栈操作
Status Push(SqStack &S, Elemtype e)
【算法3.2 栈的入栈操作】
{ /*将元素e插入到栈S中,作为S的新栈顶*/
if (S->top>= Stack_Size -1) return ERROR;
else { S->top++;
S->elem[S->top]=e;
return OK;}
Push(S,’you’)
第3章栈和队列
elem top
you 2 min 1 xx 0
(3)出栈操作
Status Pop(SqStack &S,ElemType &e) {/*若栈s不为空,则删除栈顶元素*/
{ if(s->top<0) return ERROR; /*栈空*/
else
{ e=S->elem[S->top];
S->top- -;
e=‘min’
return OK; }
}
第3章栈和队列
elem top
min 2 you 1 xx 0
(4)取栈顶元素操作 Status GetTop(SqStack s,ElemType &e) {/*若栈s不为空,则返回栈顶元素*/
{/*栈s为空时,返回为TRUE;非空时,返回为FALSE*/
if(s->top= =-1) return TRUE;
else return FALSE ;
}
第3章栈和队列
1.3 双向栈在一维数组中的实现
栈的共享中最常见的是两栈的共享。假设两个栈共享一维
数组S->elem[Stack_Size],则可以利用栈的“栈底位置不变
,栈顶位置动态变化”的特性,两个栈底分别为0和
Stack_Size-1 ,而它们的栈顶都往中间方向延伸。因此,只
要整个数组S->elem[Stack_Size]未被占满,无论哪个栈的入
栈都不0 会发生上溢。
Stack_Siz
e -1 自由区
lefttop
rightto
图3-3 两个栈共享邻接空 间
第3章栈和队列
Pop(&S,&e) 初始条件:栈S已存在且非空 操作结果: 删除S的栈顶元素,并用e返回其值
StackTraverse(S,visit()) 初始条件:栈S已存在且非空 操作结果: 从栈底到栈顶依次对S的每个数据元素调用函 数visit(),一旦visit()失败,则操作失效。 }ADT Stack
(1)初始化栈 【算法3.1 栈的初始化】 Status InitStack(SqStack s) {/*创建一个空栈由指针S指出*/
if ((s=(SqStack*)malloc(sizeof(SqStack)))= =NULL) exit(OVERFLOW);
s->top= -1; return OK; }
if(s->top==-1) return ERROR; /*栈空*/
else {e= s->elem[s->top]; return OK;}
} 取栈顶元素与出栈不同之处在于出栈操作改变 栈顶指针top的位置,而取栈顶元素操作不改变栈的栈顶指针。
第3章栈和队列
(5)判栈空操作 Status StackEmpty(SqStack s)
操作结果:构造一个空栈S。 DestroyStack(&S)
初始条件:栈S已存在 操作结果:栈S被销毁
ClearStack(&S) 初始条件:栈S已存在 操作结果:将S清为空栈
第3章栈和队列
StackEmpty(S) 初始条件:栈S已存在 操作结果:若栈S为空栈,则返回TRUE;否则,返回FALSE。 StackLength(S) 返回S的元素个数,即栈的长度。 GetTop(S,&e) 初始条件:栈S已存在且非空 操作结果: 用e返回S的栈顶元素 Push(&S,e) 初始条件:栈S已存在 操作结果:插入元素e为新的栈顶元素
下图3-2展示了顺序栈入栈、出栈中数据元素与栈顶指针的变化。
S->top=-1
(a

S->top=0
S->top=4 E
A (b)
C B A
(c)
S->top=2 C B A
(d)
(a)空栈;(b)插入元素A后;(c)插入元素B、C、D、E后;(d )删除元素E、D后
第3章栈和队列
1.2、顺序栈基本运算的算法:
入栈 栈顶 top
an
...
出栈
栈底 bottom
a2
a1 图3-1栈的示意图
第3章栈和队列
2.栈的抽象数据类型定义
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为栈底 基本操作: InitStack(S)
第3章栈和队列
栈的存储结构定义
#define Stack_Size 50
typedef struct Stack
{
ElemType elem[Stack_Size]; /*用来存放栈中元素 的一维数组*/
int top;
/*用来存放栈顶元素的下标*/
}*SqStack;
SqStack S;
第3章栈和队列
相关文档
最新文档