栈的原理与应用

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

栈顶指针增加1 图2.3 进栈操作过程图
顺序栈的基本操作实现
14
(4)进栈操作
int Push(SeqStack *S, DataType x){ if(StackFull(S)){ / /栈为满 printf("栈满!"); return FALSE; } / /栈满不能进栈 else{ / /栈不为满 S->top ++; S->data[S->top] = x; return TRUE; } }
顺序栈的基本操作实现
13
(4)进栈操作
StackSize-1 StackSize-1 StackSize-1
n n-1 n-2 1 0
an an-1
top
n n-1 n-2
1 0
top an an-1 a2 a1
n n-1 n-2 1 0
top an an-1 a2 a1
x 进栈后
x
a2 a1
x 进栈前
栈的顺序存储结构
StackSize-1
09
n n-1 n-2 1 0
约定栈顶指针指向 栈顶元素的位置。
an an-1
a2 a1
顺序栈的图示
top
当栈用顺序结构存储时, 栈的基本操作如建空栈、 进栈、出栈等操作 如何实现?
栈空:top=-1 栈满:top=StackSize-1
顺序栈的基本操作实现
17
将栈顶元素赋给指针
变量*x,操作结果只
是读取栈顶元素,栈 S不发生变化。
小结
18wenku.baidu.com
(1) 栈是一种加了限制条件的线性结构,进栈和出栈 只能从栈的一个端点进行; (2)栈是“后进先出”或者“先进后出” 的线性表; (3)栈中的元素个数可以是0,此时是空栈; (4) 栈的元素的个数是可以变化的,可以是多个,但 不能是无穷多个; (5)每个栈中的元素的类型相同。
栈的基本操作
07
(1)构造栈。 (2)判栈空。 (3)判栈满。
(4)进栈。 (5)出栈。 (6)取栈顶元素。
栈的顺序存储结构
08
1. 顺序栈的类型定义
#define StackSize 100 / /顺序栈存储空间的总分配量 typedef struct / /顺序栈存储类型 { DataType data[StackSize]; / /存放顺序栈的数组 int top; / /记录栈顶元素位置的变量 }SeqStack; 顺序栈被定义为一个结构体类型,其中DataType为栈元素的数据类 型,可以根据需要而指定某种具体的类型。data为一个一维数组, 用于存储栈中的数据元素,top为int类型,用于记录栈顶元素所在 的位置。
判断是否是空栈(即 S>top==-1 ),若栈 S 为 空 , 则返 回 1 ; 否 则 返回0。
顺序栈的基本操作实现 (3)判栈满操作
12
判 断 是 否 是 满 栈 ( 即 S>top==StackSize-1 ),若 栈S为满栈,则返回1;否 则返回0。
int StackFull(SeqStack *S){ if(S->top == StackSize-1) return TRUE; else return FALSE; }
课后作业:括号匹配检验
19
算法思想:在检验算法中设置一个栈,依次读入表达 式中的括号;
若读入的是左括号,则直接入栈,等待相匹配的同类 右括号; 若读入的是右括号,且与当前栈顶的左括号同类型, 则二者匹配,将栈顶的左括号出栈,否则属于不合法的 情况。
图2.4 出栈操作过程图
顺序栈的基本操作实现
16
(5)出栈操作
int Pop(SeqStack *S, DataType *x) { if(StackEmpty (S)) { / / 判断栈是否为空 printf("栈空!"); return FALSE; / / 栈空不能出栈 } else { / / 栈不为空 *x = S->data[S->top]; S->top --; return TRUE; } }
10
(1)初始化栈操作
首先创建一个空栈, 并将栈顶下标 top 初 始化为-1
void InitStack( SeqStack *S ){ S->top = -1; / /初始化的顺序栈为空 }
顺序栈的基本操作实现
11
(2)判断栈空操作
#define TRUE 1 #define FALSE 0 int StackEmpty (SeqStack *S){ if(S->top == -1) //栈为空 return TRUE; else return FALSE; }
栈的基本概念 1.什么是栈 栈(stack)是一种运算受限的线性表,它限定只能在表
02
的一端进行插入和删除等操作。
(a1, a2, ... , ai -1, ai , ai+1, …, an )
删除 插入
栈的基本概念 2.栈的逻辑结构
出栈 Pop
进栈 Push
03
允许进行插入和删除操作的一端 称为栈顶(top) 另一端称为栈底(bottom) 不含元素的栈称为空栈 空栈 top bottom
顺序栈的基本操作实现 (5)出栈操作
StackSize-1 StackSize-1 StackSize-1
15
n n-1 n-2 1 0
an an-1 a2 a1
top
n n-1 n-2 1 0
an an-1 a2 a1
top
n n-1 n-2 1 0
an-1
a2 a1
an出栈后
top
an出栈前
将栈顶元素赋给*x
栈顶 top
an a2
. . .
栈底 bottom
a1
栈的基本概念 3.进栈与出栈
top
top top
top top bottom bottom
04
top
A
A进栈
bottom
E D C B A
top top
top top bottom
E D C B A
B C D E 进栈
E D C 出栈
图2.1进栈与出栈操作 栈的特点:先进后出(FILO)或后进先出(LIFO)
顺序栈的基本操作实现 (6)取栈顶元素
int StackTop(SeqStack *S, DataType *x) { if(StackEmpty (S)) { //判断栈是否为空 printf("栈空!"); return FALSE; } else{ //栈不为空 *x = S->data[S->top]; return TRUE; } }
栈的应用举例 火车调度装置的功能与栈的功能类同
火车头2 火车头1 火车头1
05
火车头2
(a)车轨设置
(b)驶入 图2.2 火车调度模型
(c)驶出
栈的问题实例
06
思考:假设有A, B, C三个元素进S栈的顺序是A, B, C,写 出所有可能的出栈序列。 ABC ACB BAC BCA CAB CBA
相关文档
最新文档