版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 3.1 栈 3.1.1抽象数据类型栈的定义 3.1.2栈的表示与实现 3.2 栈的应用举例 3.2.1 数制转换 3.2.4 迷宫求解 3.2.5 表达式求值 *3.3 栈和递归的实现 3.4 队列 3.4.1抽象数据类型队列的定义 3.4.2 链队列 - 队列的链式表示与实现 3.4.3 循环队列 - 队列的顺序表示与实现第三章 栈和队列- 操作受限的线性表栈(stack): 先进后出( FILO)的线性表。或后进先出( LIFO)的线性表。或仅在表尾进行插入和删除操作的线性表。栈顶(top): 线性表的表尾端,即可操作端。栈底(bottom): 线性表的表头。3.1 栈3.1.1 抽象数
2、据类型栈的定义栈底栈顶.a1a2a3an-1an入栈(push)出栈(pop)栈的抽象数据类型ADT Stack 数据对象:D = ai | ai属于Elemset, (i=1,2,n, n0)数据关系:R1 = ai-1,ai|ai-1,ai属于D,(i=2,3,n) 约定an为栈顶, a1为栈底。 基本操作: InitStack(&S); DestroyStack(&S); ClearStack(&S); StackEmpty(S); StackLength(S) ; GetTop(S,&e); Push(&S,e); Pop(&S,&e); StackTraverse(S,visit (
3、) ADT Stack栈的基本操作(之一) InitStack(&S) 操作结果:构造一个空的栈S。 DestroyStack(&S)初始条件: 栈S已经存在。 操作结果: 销毁栈S。ClearStack(&S)初始条件: 栈S已经存在。操作结果: 将栈S重置为空栈。栈的基本操作(之二)StackEmpty(S)初始条件: 栈S已经存在。操作结果: 若栈S为空栈,则返回TURE;否则返回FALSE。StackLength(S)初始条件: 栈S已经存在。 操作结果: 返回栈S中的数据元素个数。GetTop(S,&e)初始条件: 栈S已经存在且非空。操作结果: 用e返回栈S中栈顶元素的值。栈的基本
4、操作(之三)Push(&S,e) 初始条件: 栈S已经存在。操作结果: 插入元素e为新的栈顶元素。Pop(&S,&e)初始条件: 栈S已经存在且非空。操作结果: 删除S的栈顶元素并用e返回其值。StackTraverse(S,visit ()初始条件: 栈S已经存在且非空。操作结果: 从栈底到栈顶依次对S的每个元素调用函数visit ()。一旦visit ()失败,则操作失败。3.1.2 栈的顺序表示与实现- (顺序栈)typedef struct SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL*/ SElemType *top; /* 栈顶指针 */
5、int stacksize; /* 当前已分配的存储空间,以元素为单位*/SqStack;#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define OVERFLOW -1#define ERROR 0顺序栈示意图*base*topstacksize.a1.aian*base*topstacksize初始空栈*top = *base; stacksize = STACK_INIT_SIZE顺序栈顺序栈的操作实现举例 InitStack /* 构造一个空的栈S*/Status InitStack(SqStack
6、*s) s-base=( SElemType *)malloc (STACK_INIT_SIZE * sizeof(SElemType); if(!s - base) return(OVERFLOW); s - top = s - base; s - stacksize = STACK_INIT_SIZE; return OK; /* InitStack */顺序栈的操作实现 (GetTop) 栈S非空, 则用e返回栈S中栈顶元素的值,并返回OK, 则返回ERROR。Status GetTop(SqStack s, SElemType *e) if (s.top = s.base)return
7、 ERROR; *e = *(s.top-1); return OK; /* GetTop */*base*topstacksize.a1.aianse*e = *(s.top-1);顺序栈的操作实现 (Push)插入元素e为新的栈顶元素。 Status Push(SqStack *s, SElemType e) if (s-top s-base = s-stacksize) /* 栈满,追加存储空间 */ l_temp=(SElemType*)realloc (s-base,(s-stacksize+STACKINCREMENT) *sizeof(SElemType); if (!l_tem
8、p) return(OVERFLOW); s-base = l_temp; s-top = s-base + s-stacksize; s-stacksize += STACKINCREMENT; *(s-top+) = e; return OK; /* Push */插入新的栈顶元素时,堆栈变化示意e*base*topstacksize.a1.aians*base*topstacksize.a1.aians栈满时,追加存储空间*(s-top+) = e;顺序栈的操作实现 (Pop) 栈S非空, 则删除S的栈顶元素, 用e返回栈S中栈顶元素的值,并返回OK, 否则返回ERROR。Status
9、Pop(SqStack *s, SElemType *e) if (s-top = s-base)return ERROR; *e = *(-s-top); return OK; /* Pop */*base*topstacksize.a1.aianse*e = *(-s-top);3.2 栈的应用举例3.2.1 数制转换N = (N div d)d + N mod d; 1348 = 1348/8 * 8 %8例:(1348)10 = (2504)8 N (N div 8) N mod 8 21 0 21 2 5 2 0 2先进后出: 数据生成的顺序:4,0,5,2 读出的顺序:2,5,0,
10、4*base*topstacksize4052数制转换算法(算法3.1) 输入一个非负的十进制数,输出等值的八进制数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 */#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define OVERFLOW -1#define ERRO
11、R 0typedef struct int *base; int *top; int stacksize;sqstack;栈使用的完整C程序实例int initstack(sqstack *s) s-base=(int *)malloc (STACK_INIT_SIZE*sizeof(int); s-top=s-base; s-stacksize=STACK_INIT_SIZE; return OK;void pop(sqstack *s,int *e) if(s-top=s-base)return ERROR; *e=*(-s-top); void push(sqstack *s,int e
12、) if(s-top-s-base=s-stacksize) s-base=(int*)realloc(s-base,(s- stacksize+STACKINCREMENT)*sizeof(int); if (!s-base)exit(OVERFLOW); s-top=s-base+s-stacksize; s-stacksize+=STACKINCREMENT; *(s-top+)=e;main() sqstack s; int n,m,e; initstack(&s); clrscr(); scanf(%d %d,&n,&m); while(n) push(&s,n%m); n=n/m;
13、 while(!(s.top=s.base) pop(&s,&e); printf(%d,e); 3.2.4 迷宫求解例1: start : (1,1) end : (1,4)0 1 2 3 4 5 0 1 2 3 4 5 当前位置:栈s.seat的变化迷宫求解的算法思想: 设定当前位置的初值为入口位置;do 若当前位置可通, 则 将当前位置插入栈顶; 若该位置是出口位置、则结束; 否则切换当前位置的东邻方块为新的当前位置; 否则 若栈不空且栈顶位置尚有其它方向未经探索, 则设定新的当前位置为顺时针方向旋转找到的栈顶位置 的下一相邻块; 若栈不空但栈顶位置的四周均不可通, 则 删去栈顶位置;
14、若栈不空,则重新测试新的栈顶位置, 直至找到一个可通的相邻块或出栈至空栈; while (栈不空);迷宫求解的算法: typedef struct int ord; PosType seat; int di;SElemType;Status MazePath (MazeType maze, PosType start, PosType end) InitStack(s); curpos = start; curstep = 1; do if(Pass(curpos) / 当前位置可通 FootPrint(curpos); / 留下足迹 e = (curstep, curpos,1); Push
15、(s,e); / 加入路径 if(curpos = end) return (TRUE); / 到达终点(出口) curpos = NextPos(curpos,1); / 下一个位置是当前位置的东邻方块 curstep + ; / 探索下一步 else / 当前位置不能通过 if(!StackEmpty(s) Pop(s,e); While(e.di=4 & !StackEmpty(s) MarkPrint(e.seat); / 留下不能通过的足迹 Pop(s,e); / 退回一步 if(e.di4) e.di+; Push(s,e); / 换一个方向探索 curpos = NextPos(e.seat, e.di); / 设定当前位置是该新方向上的相邻方块 while (!StackEmpty(s); return (FALSE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026四川绵阳市盐亭国有投资管理有限公司招聘管理岗位和业务岗位10人备考题库含答案详解(精练)
- 2026广东东莞市投资促进局招聘编外聘用人员1人备考题库附答案详解(b卷)
- 2026年国家机关事务管理局所属事业单位招聘备考题库(17人)带答案详解(完整版)
- 2026江苏苏州浒墅关实验幼儿园教育集团招聘1人备考题库含答案详解(精练)
- 2026浙江温州市乐清市龙西乡卫生院招聘1人备考题库含答案详解(巩固)
- 2026江苏徐州物资市场有限公司招聘6人备考题库及一套完整答案详解
- 海信集团2026届全球校园招聘备考题库及完整答案详解1套
- 2026四川成都市简阳市残疾人综合服务中心招聘编外人员1人备考题库附答案详解(达标题)
- 平安理财2027届暑期实习生招聘备考题库及答案详解(夺冠系列)
- 2026黑龙江哈尔滨丁香人才周(春季)事业单位引才招聘1222人备考题库及答案详解(夺冠)
- 项目部财务管理办法
- 一线教师课题研究 如何做课题
- 重点专题2-2 排列与组合常考题型综合(解析版)- 【重难点突破】2024-2025学年高二下·人教A版·热点题型专练 -1
- 建筑材料价格波动合同范例
- 《《孔空声乐练习曲50首》(高音卷)在美声学习中的运用及价值》
- 设备使用协议书模板
- 水利水电工程建设用地设计标准(征求意见稿)
- 页岩气及其成藏特征
- 《公路装配式混凝土桥梁设计规范》(JTG-T3365-05-2022)
- python程序设计 课件全套 董付国 第1-12章 初识python-程序设计案例分析
- 高考语文复习:文言文复习教考衔接
评论
0/150
提交评论