1、数据结构 第五讲,桂林电子科技大学信息科技学院赵莹莹,数据结构,第三章栈和队列,第3章 栈 和 队 列,内容提要:1,本章主要介绍了栈与队列两种数据结构以及他们的顺序存储与链式存储方式,并在此基础上介绍了一些基于栈与队列的应用。2,关于递归程序的设计。,本章要点,3.1 栈3.1.1 栈的定义及运算 3.1.2 栈的顺序存储结构及基本运算的实现3.1.3 栈的链式存储结构及基本运算的实现 3.2 栈的应用3.2.1 中缀表达式3.2.2 中缀表达式转换为等价的后缀表达式3.2.3 后缀表达式及求值 3.3 栈与递归3.3.1 递归与递归程序的设计3.3.2 递归程序的执行过程3.3.3 递归的
2、应用举例 3.4 队 列3.4.1 队列的定义和运算3.4.2 队列的顺序存储结构及基本运算的实现3.4.3 队列的链式存储结构及基本运算的实现 3.4.4 队列的应用举例 本章小结,3.1.1 栈的定义,栈是限制在表的一端进行插入和删除的线性表。栈的相关术语:栈顶、栈底、空栈、进栈(压栈)、出栈等。栈顶(top):允许插入和删除的一端栈底(bottom):不允许插入和删除的一端,进栈的顺序是e1、e2。 出栈的顺序为e2、e1。 所以栈又称为后进先出线性表(Last In First Out),简称 LIFO表或称先进后出线性表。,Top1,Top0,Top1,Top0,Top1,课堂练习,
3、若进栈序列为3,5,7,9,进栈过程中可以出栈,则不可能的一个出栈次序是( )。(a) 7,5,3,9(b) 9,7,5,3(c) 7,5,9,3(d) 9,5,7,3,3.1.1 栈的运算,(1)初始化栈 InitStack(S)初始条件:栈S不存在。操作结果:构造一个空栈S。 (2)压栈(入栈) Push(S, e)初始条件:栈S已存在。操作结果:插入元素e为新的栈顶元素。 (3)出栈Pop(S, e)初始条件:栈S已存在且非空。操作结果:删除S的栈顶元素,并用e返回其值。 (4) GetTop(S, &e)初始条件:栈S已存在且非空。操作结果:用e返回S的栈顶元素。 (5)StackEm
4、pty(S)初始条件:栈S已存在。操作结果:若栈S为空栈,则返回TRUE(1),否则FALSE(0)。,课堂练习,用一维数组设计栈,初态是栈空,top=-1。现有输入序列是 a、b、c、d,经过 push、push、pop、push、pop、push操作后。 输出序列是( ) 栈顶指针是( ),b,c,1,本章要点,3.1 栈3.1.1 栈的定义及运算 3.1.2 栈的顺序存储结构及基本运算的实现3.1.3 栈的链式存储结构及基本运算的实现 3.2 栈的应用3.2.1 中缀表达式3.2.2 中缀表达式转换为等价的后缀表达式3.2.3 后缀表达式及求值 3.3 栈与递归3.3.1 递归与递归程序
5、的设计3.3.2 递归程序的执行过程3.3.3 递归的应用举例 3.4 队 列3.4.1 队列的定义和运算3.4.2 队列的顺序存储结构及基本运算的实现3.4.3 队列的链式存储结构及基本运算的实现 3.4.4 队列的应用举例 本章小结,3.1.2 顺序栈的结构及运算(1),栈的顺序存储简称顺序栈。通常由一个一维数组dataMAXSIZE和一个记录栈顶元素位置的变量(top)组成说明:top指向栈顶元素当前位置。,0,1,2,MAXSIZE-1,0,1,2,MAXSIZE-1,本章要点,4.1 栈4.1.1 栈的抽象数据类型 4.1.2 顺序栈4.1.3 链栈4.1.4 栈的应用 4.2 队
6、列4.2.1 队列的抽象数据类型4.2.2 顺序队列4.2.3 链队列 4.2.4 队列的应用 4.3 递 归4.3.1 递归算法书写要点及方法4.3.2 递归过程的调用和返回4.3.3 递归的应用 4.3.4 递归函数的非递归化 本章小结,栈的顺序存储示意图:说明:也可以将base指向下标为-1的位置,top指向栈顶元素当前位置。,4.1.2 顺序栈(1),0,1,2,MAXSIZE-1,#define MAXSIZE 100 typedef structElemType dataMAXSIZE;int top; Stack;,顺序栈的描述,1) 栈的初始化InitStack(Stack *
7、S)void InitStack(Stack *S)s-top=-1;,顺序栈的运算(1),0,1,2,MAXSIZE-1,Top1,2) 压栈(入栈)操作int PushStack(Stack *S,ElemType e) /进栈操作 if(S-top=MAXSIZE-1)prinft(“n Stack is full”);return 0;s-top+;s-datas-top=e;return 1; ,顺序栈的运算(2),0,1,2,MAXSIZE-1,Top1,e,Top2,3) 判断栈是否为空int EmptyStack() /判断栈是否为空 if (S-top=-1)return 1
8、;elsereturn 0;,顺序栈的运算(3),0,1,2,MAXSIZE-1,Top1,2)出栈操作int PopStack(Stack *S,ElemType *e) / if(Empty(S) prinft(“n Stack is empty”);return 0;*e=S-datas-top;s-top-;return 1; ,顺序栈的运算(4),0,1,2,MAXSIZE-1,Top1,5) 取栈顶元素操作int GetTop (Stack *S,ElemType *x) /取栈顶元素操作 if(Empty(S)printf(“Stack is Empty”);return 0;e
9、lse*x=S-dataS-top;return 1;,顺序栈的运算(5),0,1,2,MAXSIZE-1,Top1,栈的应用举例,例一、 数制转换:编写程序实现对于一个任意的十进制数打印输出与之等值的八进制数。十进制数N和其他d进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于“除d求余”原理。 例如:(1348)10 = ( ? )8 N N div 8 N mod 81348 168 4168 21 021 2 52 0 2,2504,void conversion () / 对于输入的任意一个非负十进制整数,打印输出/ 与其等值的八进制数InitStack(S); / 构造空栈scanf (“%d“,N);while (N) Push(S, N % 8);N = N/8;while (!StackEmpty(S) Pop(S,e);printf ( “%d“, e ); / conversion,本节小结,