C语言学习-第3篇 栈与队列
第3章 栈和队列 本章主要内容 栈的概念、存储结构及其基本操作 栈的应用 栈与递归 队列的概念、存储结构及其基本操作 队列的应用 3.1 栈 栈的定义 栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的某一端进行。 进行插入和删除的称为栈顶,并用一个“栈顶指针”指示;而另一端是固定端,称为栈底。 栈的操作入栈演示 栈的操作出栈演示 栈的特点 后进先出(Last In First Out),简称为LIFO线性表。 举例1:家里吃饭的碗,通常在洗干净后一个一个地落在一起存放,在使用时,若一个一个地拿,一定最先拿走最上面的那只碗,而最后拿出最下面的那只碗。 举例2:在建筑工地上,使用的砖块从底往上一层一层地码放,在使用时,将从最上面一层一层地拿取。 栈的基本操作 1、栈初始化:Init_Stack(S) 初始条件:栈S不存在 操作结果:构造了一个空栈。 2、销毁栈:Destroy_Stack(S) 初始条件:栈S已存在 操作结果:销毁一个已存在的栈。 3、判栈空:Empty_Stack(S) 操作结果:若S为空栈返回为1,否则返回为0。 栈的基本操作 4、入栈: Push_Stack(S,x) 初始条件:栈S已存在 操作结果:在栈s的顶部插入一个新元素x, x成为新的栈顶元素。栈发生变化 5、出栈:Pop_Stack(S) 初始条件:栈S存在且非空 操作结果:栈S的顶部元素从栈中删除,栈中少了一个元素。栈发生变化 6、取栈顶元素:GetTop_Stack(S) 初始条件:栈S存在且非空 操作结果:栈顶元素作为结果返回,栈不变化 栈的顺序存储 栈的顺序存储结构是用一组连续的存储单元依次存放栈中的每个数据元素,并用起始端作为栈底。 类型定义如下所示: #define MAXSIZE 100 typedef struct { DataType data[MAXSIZE]; int top; }SeqStack, *PSeqStack; 定义一个指向顺序栈的指针: PSeqStack S; S=( PSeqStack)malloc(sizeof(SeqStack)); 顺序存储的栈的基本操作算法 1、初始化栈 顺序存储的栈的基本操作算法 2、销毁栈 顺序栈的销毁操作是初始化操作的逆运算。由于要修改栈的指针变量,所以要将指针地址传给该函数。 void Destroy_ SeqStack (PSeqStack * SeqStackPoint) {/*销毁顺序栈,入口参数:为要销毁的顺序栈指针地址*/ if (*SeqStackPoint) free (*SeqStackPoint) ; * SeqStackPoint =NULL; return ; } 顺序存储的栈的基本操作算法 main() { PSeqStack S; S=Init_SeqStack(); …… Destroy_ SeqStack (&S); } 顺序存储的栈的基本操作算法 3、判栈空 判断栈中是否有元素,只需判断top是否等于-1 int Empty_SeqStack(PSeqStack S) {/*判断栈是否为空,入口参数:顺序栈,返回值:1表示为空,0表示非空*/ if (S->top= = -1) return 1; else return 0; } 顺序存储的栈的基本操作算法 4、入栈 入栈操作是在栈的顶部进行插入一个元素。首先判断栈是否已满,若满退出,否则,由于栈的top指向栈顶,只要将入栈元素赋到top+1的位置同时top++即可 顺序存储的栈的基本操作算法 5、出栈 出栈操作是在栈的顶部进行删除操作,首先判断栈是否为空,若空退出,否则,由于栈的top指向 栈顶,只要修改top为top -1即可。 顺序存储的栈的基本操作算法 6、取栈顶元素 取栈顶元素操作是取出栈顶指针top所指的元素值。先判断栈是否为空,若空退出,否则返回top 所指单元的值 栈的链式存储 若是栈中元