第3章 栈和队列
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.2.1 队列的定义
4)GetHead(Q) 主要功能是:若已知队列Q非空,则返回 队头元素;否则返回空。 (5)EmptyQueue(Q) 主要功能是:若已知队列Q为空则返回 TRUE,否则返回FALSE。 (6)DispQueue(Q) 主要功能是:显示队列中所有元素的值。
3.1.2.2顺序栈的基本运算
1.初始化栈的算法 void InitStack (sqstack *s ) { /* 初始化栈 */ S->top=-1; } /* InitStack */
3.1.2.2顺序栈的基本运算
2.进栈操作 if ( s->top >=MAXSIZE-1 ) /* 栈溢出的情 况 */ { printf("stack overflow !\n"); return(FALSE); }
3.1.2.2顺序栈的基本运算
5.判栈空算法 if (s->top<0) return(TRUE); /* TRUE表示栈空 */ else return(FALSE); /* FALSE表示栈非空 */
3.1.2.2顺序栈的基本运算
6.栈的遍历操作 (算法如下页所示)
3.1.2.2顺序栈的基本运算
3.1.1 栈的定义
栈(stack)是限定在表尾一端进行插入 或删除操作的线性表。在栈中,允许插 入和删除操作的一端称为栈顶(top), 而另一端称为栈底(bottom)。不含元 素的栈称为空栈。
3.1.1 栈的定义
在栈的运算中,栈的插入操作称为进栈 或入栈,栈的删除操作称为退栈或出栈。 根据栈的定义,每一次进栈的元素都在 原栈顶元素之上,并成为新的栈顶元素; 每一次出栈的元素总是当前的栈顶元素, 因此最后进栈的元素总是最先出栈,所 以栈也称为后进先出(Last In First Out) 线性表,简称为LIFO表。
第3章 栈和队列
19.理解队列满和空的含义 20.掌握顺序队列和循环队列判断“满”和 空的条件 21.掌握队列的链式存储结构及其描述方法 22.掌握队列的链队列的基本运算 23.了解队列的广泛应用 24.理解键盘缓冲区问题和迷宫问题求解
第3章 栈和队列
3.1 栈 3.1.1 栈的定义 3.1.2 栈的顺序存储及其基本运算 3.1.3 栈的链式存储及其基本运算 3.1.4 栈的应用――算术表达式求值 *3.1.5栈与递归
3.2.2.1 顺序队列的描述
顺序队列的结构可以用C语言定义如下 define MAXSIZE 100; /* 这里设置MAXSIZE 的值为100 */ typedef char elemtype; typedef struct { elemtype queue[MAXSIZE]; /* 数 组 queue[]为用户自定义类型 */ int front, rear; /* 定 义 整 型 变 量 front 与 rear分别为队头指针和队尾指针 */ }sequeuetype; sequeuetype Q;
3.1.2.3双栈的结构及基本运算
0 a0
图3.3双栈共享同一个向量示意图
1 a1 „ „ n-1 an-1 top[0] bn-1 top[1] „ b1 M-1 b0
3.1.2.3双栈的结构及基本运算
这种栈的数据结构可以用C语言定义如下: #define M 100 typedef struct { elemtype stack[M]; int top[2]; }dbstack; /* 定义双栈数据类型dbstack */ dbstack *s; /* 定义dbstack型指针变量 s */
3.1.1 栈的定义
(7)Push(S, x) 主要功能是:入栈操作,在S栈的顶部插入一 个元素x,栈顶位置由top指针指出。 (8)Pop(S) 主要功能是:出栈操作,若栈S不空,则在栈 顶删除栈顶元素,并返回被删除元素的值。 (9)DisplayStack 主要功能是:栈的遍历操作,即从栈底到栈顶 逐次显示栈中的元素。
第3章 栈和队列
7.掌握描述链栈结构的方法 8.掌握链栈上的基本运算 9.了解栈的广泛应用 10.掌握中缀表达式转换为波兰式的 方法 11.理解队列的逻辑结构定义及特点 12.掌握顺序队列存储结构及其的描 述方法
第3章 栈和队列
13.掌握顺序队列上的基本运算 14.理解栈和队列中“上溢”和“下溢”的 概念 15.理解顺序队列出现“假上溢”的原因及 其解决方案 16.掌握循环顺序队列的结构 17.重点掌握循环队列的基本运算 18.理解循环顺序队列消除“假上溢”的方 法
第3章 栈和队列
内容提要: 本章的基本内容是:栈和队列的定义; 在顺序和链式存储结构上如何实现栈和 队列的基本操作;栈与队列的应用。
第3章 栈和队列
学习要点: 1.理解栈的逻辑结构定义及特点 2.掌握栈的顺序存储结构的描述 3.重点掌握顺序栈上的基本运算 4.理解双栈的结构 5.理解双栈的基本运算 6.掌握栈的链式存储结构
3.出栈操作 if (s->top<0) /* 栈空情况 */ { printf("stack underflow !\n"); return(NULL); } else /* 栈非空情况 */ { s->top--; /* 栈顶指针减1 */ return(s->stack[s->top+1]); /* 返回 出栈的元素 */ }
3.2.1 队列的定义
队列的基本运算有如下几种: (1)InitQueue (Q) 主要功能是:建立一个空的队列Q。 (2)EnQueue(Q,x) 主要功能是:将x插入到已知队列Q中。 (3)DelQueue(Q) 主要功能是:在已知队列Q中,若队列非空, 则删除队头元素,并返回该元素的值;否则返 回空。
Байду номын сангаас
3.1.2.2顺序栈的基本运算
else {
/* 栈非溢出的情况 */ s->top++; /* 栈顶指针加1 */ s->stack[s->top]=x; /* 入栈操作 */ return(TRUE); /* 正常返回 */
}
3.1.2.2顺序栈的基本运算
3.1.3 栈的链式存储及其基本运 算
图3.4是链栈的示意图
top C top D
B
top
B
B
A
^
A
^
A
^
(a)
(b)
(c)
3.1.3 栈的链式存储及其基本运 算
下面是用C语言描述的链栈的结构: typedef char elemtype; typedef struct node { elemtype data; struct node *next; }linkstack; /* 定义链栈数据类型linkstack */ linkstack *top; /* 定义栈顶指针 */
3.1.5栈与递归
栈的又一个重要应用是实现程序设计中 的递归。递归是算法编写中最富有表现 力和技巧性的问题之一,它是程序设计 的一个强有力的工具。在算法或程序中, 当一个函数直接调用自己或通过一系列 语句间接调用自己的时候,我们称这个 函数为递归函数,递归函数也称为自调 用函数。
3.2 队列
3.2队列 3.2.1 队列的定义 3.2.2队列的顺序存储结构――顺序队 列 3.2.3循环顺序队列 3.2.4队列的链式存储结构――链队列 3.2.5队列的应用举例
3.1.4 栈的应用――算术表达式 求值
人们日常计算用到的表达式,如(3+2)*5、 4*(6+7)/9等,都被称为中缀表达式, 这是由于这种算术表达式的运算符被置 于两个操作数中间。中缀表达式的计算 是按照算术运算规则进行的,即先括号 内,后括号外,先乘除后加减,同级运 算先左后右等。
3.1.4 栈的应用――算术表达式 求值
3.1.1 栈的定义
栈的基本运算有如下几种: (1)InitStack(S) 主要功能是:初始化操作,构造一个空栈操作。 (2)DestroyStack(S) 主要功能是:将已经存在的栈销毁。 (3)ClearStack(S) 主要功能是:将已经存在的栈清空。
3.1.1 栈的定义
3.1.2.2顺序栈的基本运算
4.取栈顶元素 if (s->top<0) /* 栈空的情况 */ { printf("Stack is empty !\n"); return(NULL); } else /* 栈非空的情况 */ return(s->stack[s->top]); /* 返回栈顶 元素 */
void display_stack(stacktype *s) { /*栈的遍历操作 */ int i; printf("The elements in the stack are :\n"); for (i=s->top;i>=0;i--) /* 从栈顶到栈底逐个 显示栈中元素 */ printf("%c ",s->stack[i]); } /* display_stack */
3.2.2.1 顺序队列的描述
队列的顺序存储结构,又称为顺序队列 (Sequential Queue),是用一组地址连续 的存储单元依次存放队列中的元素。 顺序队列往往用数组的形式来进行描述。由于 队列中的元素经常变化,对于队列的删除和插 入分别在队头和队尾进行,因此需要设置两个 指针分别指向队头和队尾元素,这两个指针又 称为队头指针和队尾指针。
3.1.2.1栈的顺序存储结构的描 述
栈是一种操作受到限制的线性表,是一 种特殊的线性表,因此栈也有顺序和链 式两种存储结构,分别称为顺序栈和链 栈。
3.1.2.1栈的顺序存储结构的描 述
顺序栈的类型和变量可以用C语言定义如下: #define MAXSIZE 100 /* 栈的 最大容量 */ typedef int elemtype; typedef struct { elemtype stack[MAXSIZE]; int top; }sqstack; /* 定义 顺序 栈 类型 sqstack */ sqstack *s; /* 定义sqstack类型的变 量s */
3.2.1 队列的定义
队列(Queue)也是一种特殊的线性表, 但它与栈不同,队列中所有的插入均限 定在表的一端进行,而所有的删除则限 定在表的另一端进行。允许插入的一端 称为队尾(rear),允许删除的一端称 为队头(front)。
3.2.1 队列的定义
队列的特点是先进先出(First In First Out, 缩写为FIFO),因此队列又被称为 先进先出的线性表,或称为FIFO表。
3.2.2.2 顺序队列的基本运算
顺序队列初始化 void init_squeue ( sequeuetype *Q) { /* 顺序队列初始化 */ Q->front=-1; Q->rear=-1; } /* init_squeue */
然而在计算机中处理中缀表达式就比较 麻烦,需要对表达式进行多次扫描才能 完成计算。计算机中通常使用后缀表达 式,这是一种将运算符置于两个操作数 后面的算术表达式。这种表达式是由波 兰科学家谢维奇提出的,因此又称为波 兰式。
3.1.4 栈的应用――算术表达式 求值
表3.3 计算后缀表达式的过程
操作 B+C→T1 A*T1→T2 T2*D→T3 后缀表达式 ABC+*D* AT1*D* T2D* T3
(4)StackEmpty(S) 主要功能是:判断栈是否为空,若S为空,则 返回TRUE否则返回FALSE。 (5)StackLength(S) 主要功能是:返回当前栈中元素的个数。 (6)GetTop(S) 主要功能是:若栈S不空,则取栈顶元素的值, 注意栈顶元素不被删除,栈顶指针top也不被 改变。