1、实验二堆栈实验报告教材 计算机科学与技术系 实 验 报 告 专业名称 计算机科学与技术 课程名称 数据结构与算法 项目名称 实验二堆栈实验 班 级 1 学 号 姓 名 同组人员 无 实验日期 实验二 堆栈实验实验题目 1:将十进制正整数转换成十六进制的算法1.问题分析本程序要求实现将十进制正整数转换成十六进制的算法。完成该实验需要以下3个子任务:首先定义一个顺序栈SeqStack的类型,再写出栈的基本算法的函数。用dectohex()函数实现将十进制化为16进制的数入栈;在主函数完成数据的输出和出栈。测试数据设计如下:2448991001012.概要设计1)为了实现上述程序功能,需要:定义一个
2、顺序栈SeqStack 的类型定义栈的基本算法调用函数dectohex把十进制转换为16进制存入s中在主函数中完成16进制的输出2)本程序包含7个函数:1.主函数main()2.置空栈InitStack()3.判栈空StackEmpty()4.取栈顶函数GetTop()5.入栈Push()6.出栈Pop()7.dectohex() 各函数关系如下: InitStack、 StackEmptymain GetTop Push Pop dectohex3、详细设计实现概要设计中定义的所有的数据类型,对每个操作给出了算法和代码,主程序和模块都需要代码。(1)顺序栈 #define maxlen 10
3、0typedef struct int datamaxlen; int top;SeqStack; (2) 栈的基本算法SeqStack *InitStack(SeqStack *s) /建立一个空栈 s-top=-1; return s;int StackEmpty(SeqStack *s) /判断栈是否为空 if(s-top=0) return 0; else return 1;int GetTop(SeqStack *s) /取栈顶元素 if(s-toptop=0 ) return (s-datas-top); else printf(effor);void Push (SeqStack
4、 *s,int x) /入栈 if(s-toptop=-1) s-top+;s-datas-top=x; else printf(effor);void Pop (SeqStack *s) /出栈 if(s-top=0) s-top-; else printf(effor);(3)用dectohex()函数实现将十进制化为16进制的数入栈void dectohex(long num) /将十进制转换成十六进制 InitStack(&s); while(num) int k=num%16; Push(&s,k); num=num/16; (4)在主函数完成数据的十六进制输出和出栈。int mai
5、n() long num; scanf(%ld,&num); dectohex(num); while(!StackEmpty(&s) /以十六进制输出 int x=GetTop(&s); if(x10) printf(%d,x); else switch (x) case 10:printf(A);break; case 11:printf(B);break; case 12:printf(C);break; case 13:printf(D);break; case 14:printf(E);break; case 15:printf(F);break; Pop(&s); printf(n
6、); return 0;4、调试分析 编译时在主函数定义了SeqStack s,在dectohex()里也有这个语句,十进制转十六进制时是储存在形参的栈里面,执行之后,并没有传递给实参,导致输出为空。解决办法把s定义为全局变量,或者在dectohex()函数多声明个形参。本程序使用的是把s定义为全局变量。5、用户使用说明 程序名为class1.exe,在DEBUG文件夹里面。运行环境Visual c+ 6.0。6、测试结果7、附录#include #define maxlen 100typedef struct /顺序栈的定义 int datamaxlen; int top;SeqStack;
7、SeqStack s;SeqStack *InitStack(SeqStack *s) /建立一个空栈 s-top=-1; return s;int StackEmpty(SeqStack *s) /判断栈是否为空 if(s-top=0) return 0; else return 1;int GetTop(SeqStack *s) /取栈顶元素 if(s-toptop=0 ) return (s-datas-top); else printf(effor);void Push (SeqStack *s,int x) /入栈 if(s-toptop=-1) s-top+;s-datas-top
8、=x; else printf(effor);void Pop (SeqStack *s) /出栈 if(s-top=0) s-top-; else printf(effor);void dectohex(long num) /将十进制转换成十六进制 InitStack(&s); while(num) int k=num%16; Push(&s,k); num=num/16; int main() long num; scanf(%ld,&num); dectohex(num); while(!StackEmpty(&s) /以十六进制输出 int x=GetTop(&s); if(xtop=
9、-1; return s;int StackEmpty(SeqStack *s) /判断栈是否为空 if(s-top=0) return 0; else return 1;int StackFull(SeqStack s) /判断栈是否为满 if(s.top = maxlen-1) return 1; else return 0;int GetTop(SeqStack *s) /取栈顶元素 if(s-toptop=0 ) return (s-datas-top); else printf(effor);void Push (SeqStack *s,int x) /入栈 if(s-toptop=
10、-1) s-top+;s-datas-top=x; else printf(effor);void Pop (SeqStack *s) /出栈 if(s-top=0) s-top-; else printf(effor);(3)用compare()函数判断字符串是否有中心对称关系int compare(char s1) SeqStack s; int i,len; InitStack(&s); len = strlen(s1); for(i=0;ilen/2;i+) Push(&s,s1i); for(i=(len+1)/2;ilen;i+) if(s1i != GetTop(&s) return 0; else Pop(&s); return 1;(4)在主函数完成判断结果的输出void main() char s120; printf(请输入一个回文串:n); gets(s1); printf(判断结果:n); if(co
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1