数据结构算法设计与实现指导(C语言版).docx
《数据结构算法设计与实现指导(C语言版).docx》由会员分享,可在线阅读,更多相关《数据结构算法设计与实现指导(C语言版).docx(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构算法设计与实现指导(C语言版) 第3章栈实验三 3.1 实验目的及要求 1理解特殊的线性结构顺序栈的抽象数据类型的定义,及其在C语言环境中的表示方法。 2理解顺序栈的基本操作的算法,及其在C语言环境中一些主要基本操作的实现。 3在C语言环境下实现顺序栈的应用操作: 利用栈实现十进制数转换成八进制数。 利用栈实现一位数的加减乘除的表达式求解。 3.2 实验内容 经过对实验目的及要求的分析,本实验仍然采用首先描述栈的基本操作集函数,然后分别在两个应用操作中使用基本操作集函数来实现。 由于栈是一种特殊的线性结构,仅在栈顶进行插入和删除操作,即栈具有后进先出的特点,故其操作比一般的线性表更为容
2、易,所以在本实验中有关栈的基本操作集的实现都比较简单,没有做过多的说明,而是在数制转换和表达式求解的应用操作中加入了更多的编程技巧,使读者通过本实验不仅了解栈这种特殊结构的线性表,而且掌握利用栈可实现很多的应用,尤其是在实现表达式求解时用到了两个顺序栈,并且加入了运算符的优先关系的判断等,实现稍有难度。 在程序Stack.c中,只包含了数制转换和一位数的表达式求解,多位数的表达式求解思想与一位数表达式求解思想一致,但需要添加多位数的接收处理,请读者自行编写代码。 程序名为:Stack.c。 在Stack.c中包含的函数如图3.1所示。 数据结构算法设计与实现指导(C语言版) 28 图3.1 S
3、tack.c中包含的函数一览表 3.3 功能函数的分析设计及源代码 本部分列出了实现顺序栈的操作的源代码,并在适当的位置上添加了一些文字和流程图的注释,帮助读者理解顺序存储的栈的存储结构及操作算法。 文件名:Stack.c #include alloc.h #include stdio.h #define STACK_INIT_SIZE 10 #define STACKINCREMENT 2 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int SElemType;
4、 typedef int Status; /定义顺序栈的结构 typedef struct SqStack SElemType *base; SElemType *top; int stacksize; SqStack; /初始化一个空栈 Status InitStack(SqStack *S) (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType); if(!(*S).base) exit(OVERFLOW); 第3章栈实验三 29 (*S).top=(*S).base; (*S).stacksize=STACK_INI
5、T_SIZE; return OK; /数据元素入栈 Status Push(SqStack *S,SElemType e) if(*S).top-(*S).base=(*S).stacksize) (*S).base=(SElemType*)realloc(*S).base, (*S).stacksize+STACKINCREMENT) *sizeof(SElemType); if(!(*S).base) exit(OVERFLOW); (*S).top=(*S).base+(*S).stacksize; (*S).stacksize+=STACKINCREMENT; *(*S).top)+
6、=e; return OK; /数据元素出栈 Status Pop(SqStack *S,SElemType *e) if(*S).top=(*S).base) return ERROR; *e=*-(*S).top; return OK; /判断一个栈是否为空 Status StackEmpty(SqStack S) if(S.top=S.base) return TRUE; else return FALSE; /销毁一个栈 Status DestroyStack(SqStack *S) free(*S).base); (*S).base=NULL; (*S).top=NULL; (*S)
7、.stacksize=0; return OK; /十进制数转换成八进制 本函数实现了无符号十进制数和八进制数间的转换功能。 如输入的是负数,由于系统使用补码表示负数,会自动将其进行补码转换,再通过本 数据结构算法设计与实现指导(C语言版) 30 函数对其实现八进制转换。如,当输入1时,结果显示65535。 如果需要将十进制转换成十六进制应该如何修改本函数?方法有两种,第一种,在入栈时,存入十六进制数;第二种,在出栈时,输出十六进制数。请读者自己编写代码。 void conversion() SqStack s; unsigned n; SElemType e; InitStack(&s);
8、printf(Please input a decimal number:); scanf(%u,&n); while(n) Push(&s,n%8); n=n/8; printf(The corresponding octal number is:); while(!StackEmpty(s) Pop(&s,&e); printf(%d,e); printf(n); DestroyStack(&s); /取栈顶的数据元素 Status GetTop(SqStack S,SElemType *e) if(S.topS.base) *e=*(S.top-1); return OK; else r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 设计 实现 指导 语言版
限制150内