实验二堆栈实验报告教材.docx
《实验二堆栈实验报告教材.docx》由会员分享,可在线阅读,更多相关《实验二堆栈实验报告教材.docx(21页珍藏版)》请在冰豆网上搜索。
![实验二堆栈实验报告教材.docx](https://file1.bdocx.com/fileroot1/2022-10/23/71c8afeb-cd7d-46ff-93fb-4c80bbd3bd4d/71c8afeb-cd7d-46ff-93fb-4c80bbd3bd4d1.gif)
实验二堆栈实验报告教材
计算机科学与技术系
实验报告
专业名称计算机科学与技术
课程名称数据结构与算法
项目名称实验二堆栈实验
班级1
学号
姓名
同组人员无
实验日期
实验二堆栈实验
实验题目1:
将十进制正整数转换成十六进制的算法
1.问题分析
本程序要求实现将十进制正整数转换成十六进制的算法。
完成该实验需要以下3个子任务:
首先定义一个顺序栈SeqStack的类型,再写出栈的基本算法的函数。
用dectohex()函数实现将十进制化为16进制的数入栈;
在主函数完成数据的输出和出栈。
测试数据设计如下:
24
48
99
100
101
2.概要设计
1)为了实现上述程序功能,需要:
定义一个顺序栈SeqStack的类型定义栈的基本算法调用函数dectohex把十进制转换为16进制存入s中在主函数中完成16进制的输出
2)本程序包含7个函数:
1.主函数main()
2.置空栈InitStack()
3.判栈空StackEmpty()
4.取栈顶函数GetTop()
5.入栈Push()
6.出栈Pop()
7.dectohex()
各函数关系如下:
InitStack、
StackEmpty
mainGetTop
Push
Pop
dectohex
3、详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出了算法和代码,主程序和模块都需要代码。
(1)顺序栈
#definemaxlen100
typedefstruct{
intdata[maxlen];
inttop;
}SeqStack;
(2)栈的基本算法
SeqStack*InitStack(SeqStack*s){//建立一个空栈
s->top=-1;
returns;
}
intStackEmpty(SeqStack*s){//判断栈是否为空
if(s->top>=0)return0;
elsereturn1;
}
intGetTop(SeqStack*s){//取栈顶元素
if(s->top<=maxlen-1&&s->top>=0)return(s->data[s->top]);
elseprintf("effor");
}
voidPush(SeqStack*s,intx){//入栈
if(s->toptop>=-1){
s->top++;s->data[s->top]=x;
}elseprintf("effor");
}
voidPop(SeqStack*s){//出栈
if(s->top>=0)s->top--;
elseprintf("effor");
}
(3)用dectohex()函数实现将十进制化为16进制的数入栈
voiddectohex(longnum){//将十进制转换成十六进制
InitStack(&s);
while(num){
intk=num%16;
Push(&s,k);
num=num/16;
}
(4)在主函数完成数据的十六进制输出和出栈。
intmain()
{
longnum;
scanf("%ld",&num);
dectohex(num);
while(!
StackEmpty(&s)){//以十六进制输出
intx=GetTop(&s);
if(x<10){
printf("%d",x);
}
else{
switch(x){
case10:
printf("A");break;
case11:
printf("B");break;
case12:
printf("C");break;
case13:
printf("D");break;
case14:
printf("E");break;
case15:
printf("F");break;
}
}
Pop(&s);
}
printf("\n");
return0;
}
4、调试分析
编译时在主函数定义了SeqStacks,在dectohex()里也有这个语句,十进制转十六进制时是储存在形参的栈里面,执行之后,并没有传递给实参,导致输出为空。
解决办法把s定义为全局变量,或者在dectohex()函数多声明个形参。
本程序使用的是把s定义为全局变量。
5、用户使用说明
程序名为class1.exe,在DEBUG文件夹里面。
运行环境Visualc++6.0。
6、测试结果
7、附录
#include
#definemaxlen100
typedefstruct{//顺序栈的定义
intdata[maxlen];
inttop;
}SeqStack;
SeqStacks;
SeqStack*InitStack(SeqStack*s){//建立一个空栈
s->top=-1;
returns;
}
intStackEmpty(SeqStack*s){//判断栈是否为空
if(s->top>=0)return0;
elsereturn1;
}
intGetTop(SeqStack*s){//取栈顶元素
if(s->top<=maxlen-1&&s->top>=0)return(s->data[s->top]);
elseprintf("effor");
}
voidPush(SeqStack*s,intx){//入栈
if(s->toptop>=-1){
s->top++;s->data[s->top]=x;
}elseprintf("effor");
}
voidPop(SeqStack*s){//出栈
if(s->top>=0)s->top--;
elseprintf("effor");
}
voiddectohex(longnum){//将十进制转换成十六进制
InitStack(&s);
while(num){
intk=num%16;
Push(&s,k);
num=num/16;
}
}
intmain()
{
longnum;
scanf("%ld",&num);
dectohex(num);
while(!
StackEmpty(&s)){//以十六进制输出
intx=GetTop(&s);
if(x<10){
printf("%d",x);
}
else{
switch(x){
case10:
printf("A");break;
case11:
printf("B");break;
case12:
printf("C");break;
case13:
printf("D");break;
case14:
printf("E");break;
case15:
printf("F");break;
}
}
Pop(&s);
}
printf("\n");
return0;
}
实验题目2:
用栈判断所给的字符串是否具有中心对称的关系,要求尽可能少的时间完成判断。
1.问题分析
本程序要求实现用栈判断字符串是否为回文字符串的算法。
完成该实验需要以下3个子任务:
首先定义一个顺序栈SeqStack的类型,再写出栈的基本算法的函数。
用compare()函数实现判断字符串是否具有中心对称的关系;
在主函数输出判断结果。
测试数据设计如下:
xyzyx
abcddcba
2.概要设计
3)为了实现上述程序功能,需要:
定义一个顺序栈SeqStack的类型定义栈的基本算法调用函数compare()函数判断字符串是否具有中心对称的关系在主函数中输出判断结果
4)本程序包含8个函数:
1.主函数main()
2.置空栈InitStack()
3.判栈空StackEmpty()
4.判栈满StackFull()
5.取栈顶函数GetTop()
6.入栈Push()
7.出栈Pop()
pare()
各函数关系如下:
InitStack、
StackEmpty
mainGetTop
Push
Pop
StackFull
compare
4、详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出了算法和代码,主程序和模块都需要代码。
(1)顺序栈
#definemaxlen100
typedefstruct{
intdata[maxlen];
inttop;
}SeqStack;
(2)栈的基本算法
SeqStack*InitStack(SeqStack*s){//建立一个空栈
s->top=-1;
returns;
}
intStackEmpty(SeqStack*s){//判断栈是否为空
if(s->top>=0)return0;
elsereturn1;
}
intStackFull(SeqStacks){//判断栈是否为满
if(s.top==maxlen-1)
return1;
else
return0;
}
intGetTop(SeqStack*s){//取栈顶元素
if(s->top<=maxlen-1&&s->top>=0)return(s->data[s->top]);
elseprintf("effor");
}
voidPush(SeqStack*s,intx){//入栈
if(s->toptop>=-1){
s->top++;s->data[s->top]=x;
}elseprintf("effor");
}
voidPop(SeqStack*s){//出栈
if(s->top>=0)s->top--;
elseprintf("effor");
}
(3)用compare()函数判断字符串是否有中心对称关系
intcompare(chars1[]){
SeqStacks;
inti,len;
InitStack(&s);
len=strlen(s1);
for(i=0;iPush(&s,s1[i]);
}
for(i=(len+1)/2;iif(s1[i]!
=GetTop(&s))
return0;
else
Pop(&s);
}
return1;
}
(4)在主函数完成判断结果的输出
voidmain(){
chars1[20];
printf("请输入一个回文串:
\n");
gets(s1);
printf("判断结果:
\n");
if(co