数据结构实验二资料.docx
- 文档编号:27812759
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:19
- 大小:80.98KB
数据结构实验二资料.docx
《数据结构实验二资料.docx》由会员分享,可在线阅读,更多相关《数据结构实验二资料.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构实验二资料
实验报告
学院(系)名称:
计算机与通信工程学院
姓名
王宏昌
学号
20135628
专业
计算机科学与技术
班级
2班
实验名称
实验二栈与队列应用
课程名称
数据结构
课程代码
实验时间
2016
实验地点
7-220
批改意见
成绩
教师签字:
1.实验目的
理解栈和队列的逻辑特点;掌握栈和队列基本操作的实现,并能达到在实际问题背景下的灵活运用栈或队列结构解决问题的程度。
2.实验要求
具体实验题目:
(任课教师根据实验大纲自己指定)
每位同学完成下面2个题目:
1.十进制数与N进制数据的转换
1)问题描述:
将从键盘输入的十进制数转换为N(如二进制、八进制、十六进制)进制数据。
2)要求:
利用顺序栈实现数制转换问题
2.算术表达式求值算法
1)问题描述:
从键盘输入一个算术表达式并输出它的结果
2)要求:
算术表达式可包含加、减、乘、除、十进制整数和小括号,利用栈实现
3.实验过程记录(源程序、测试用例、测试结果及心得体会等)
1.十进制数与N进制数据的转换
#include
#include
#defineStackInitSize100
typedefstruct
{
intdata[StackInitSize];
inttop;
}SeqStack;
SeqStack*InitStack()
{
SeqStack*s;
s=(SeqStack*)malloc(sizeof(SeqStack));
if(s!
=NULL)
{
s->top=0;
returns;
}
else
{
printf("ERROR!
NOSPACE!
EXIT!
");
exit(0);
}
}
intIsEmpty(SeqStack*s)
{
return(s->top==0)?
1:
0;
}
voidPush(SeqStack*s,intx)
{
if(s->top==StackInitSize-1)
{
printf("FULL!
EXIT!
");
exit(0);
}
else
{
s->data[s->top]=x;
s->top++;
}
}
SeqStack*convert(intx,inty)
{
SeqStack*s;
s=InitStack();
inta;
while(x!
=0)
{
a=x%y;
Push(s,a);
x=x/y;
}
returns;
}
intPop(SeqStack*s)
{
intt;
if(IsEmpty(s))
{
printf("NULL!
EXIT!
");
exit(0);
}
else
{
t=s->data[s->top];
s->top--;
returnt;
}
}
intTopStack(SeqStack*s)//取栈顶
{
if(IsEmpty(s))
{
printf("NULL!
EXIT!
");
exit(0);
}
else
returns->data[s->top];
}
voidDestroyStack(SeqStack*s)
{
free(s);
printf("StackDestroed!
\n");
}
voidShow(SeqStack*s)
{
intt;
if(IsEmpty(s))
{
printf("NULL!
EXIT!
");
exit(0);
}
else
{
t=s->top-1;
while(t>=0)
{
if(s->data[t]<10)
printf("%d",s->data[t]);
else
{
switch(s->data[t])
{
case10:
printf("A");
//break;
case11:
printf("B");
//break;
case12:
printf("C");
//break;
case13:
printf("D");
//break;
case14:
printf("E");
//break;
case15:
printf("F");
//break;
}
}
t--;
}
printf("\n");
}
}
intmain()
{
SeqStack*s;
intx,y;
printf("EnterDecimalnumber&Basenumber:
");
scanf("%d",&x);
s=convert(x,2);
printf("Decimalnumber%dconvertsto2basenumberis:
\n",x);
printf("%d=",x);
Show(s);
s=convert(x,8);
printf("Decimalnumber%dconvertsto8basenumberis:
\n",x);
printf("%d=",x);
Show(s);
s=convert(x,16);
printf("Decimalnumber%dconvertsto16basenumberis:
\n",x);
printf("%d=",x);
Show(s);
printf("EnterDecimalnumber&Basenumber:
");
scanf("%d%d",&x,&y);
s=convert(x,y);
printf("Decimalnumber%dconvertsto16basenumberis:
\n",x);
printf("%d=",x);
Show(s);
return0;
}
2.算术表达式求值算法
#include
#include
#defineMaxSize100
typedefstructnode
{
chardata;
structnode*next;
}LinkStack;
LinkStack*InitStack()
{
LinkStack*top;
top=(LinkStack*)malloc(sizeof(LinkStack));
if(!
top)
{
printf("ERROR!
NOSPACE!
EXIT!
");
exit(0);
}
else
top=NULL;
returntop;
}
intIsEmpty(LinkStack*top)
{
returntop!
=NULL?
0:
1;
}
LinkStack*Push(LinkStack*top,charx)
{
LinkStack*p;
p=(LinkStack*)malloc(sizeof(LinkStack));
if(p)
{
p->data=x;
p->next=top;
top=p;
returntop;
}
else
{
printf("ERROR!
NOSPACE!
EXIT!
");
exit(0);
}
}
LinkStack*Pop(LinkStack*top,char*x)
{
LinkStack*p;
if(IsEmpty(top))
{
printf("ERROR!
NULL!
EXIT!
");
exit(0);
}
else
{
p=top;
*x=top->data;
top=top->next;
free(p);
returntop;
}
}
charGettop(LinkStack*top)
{
if(IsEmpty(top))
{
printf("ERROR!
NULL!
EXIT!
");
exit(0);
}
else
returntop->data;
}
intsub(chars)
{
switch(s)
{
case'+':
return1;
break;
case'-':
return1;
break;
case'*':
return2;
break;
case'/':
return2;
break;
case'(':
return3;
break;
case')':
return4;
break;
case'#':
return0;
}
}
intmain()
{
charstr[MaxSize],t,temp[MaxSize];
inti=0,j=0,k=0,m=0,n,length;
chara,b,c;
LinkStack*OPTR,*OPND,*OT,*ON;
OPTR=InitStack();
OPND=InitStack();
OPTR=Push(OPTR,'#');
printf("Enterexpression&endwith#:
");
scanf("%s",&str);
while(str[i]!
='#')
i++;
length=i;
i=0;
if(str[0]=='#')
{
printf("NULL!
");
return0;
}
else
{
while(i<=length)
{
if(str[i]!
='+'&&str[i]!
='-'&&str[i]!
='*'&&str[i]!
='/'&&str[i]!
='('&&str[i]!
=')'&&str[i]!
='#')
{
if(i>0)
{
if(str[i]-48>=0&&str[i]-48<=9&&str[i-1]-48>=0&&str[i-1]-48<=9)
{
OPND=Pop(OPND,&a);
a=a-48;
n=str[i]-48;
a=a*10+n;
OPND=Push(OPND,a+48);
i++;
}
else
{
OPND=Push(OPND,str[i]);
i++;
}
}
else
{
OPND=Push(OPND,str[i]);
i++;
}
}
else
{
if(Gettop(OPTR)=='#')
{
if(str[i]=='#')
break;
else
{
OPTR=Push(OPTR,str[i]);
i++;
}
}
elseif(sub(str[i])>sub(Gettop(OPTR)))
{
OPTR=Push(OPTR,str[i]);
i++;
}
elseif(sub(str[i])==sub(Gettop(OPTR)))
{
if(sub(str[i])==1)
{
OPTR=Pop(OPTR,&t);
OPND=Pop(OPND,&a);
OPND=Pop(OPND,&b);
a=a-48;
b=b-48;
switch(t)
{
case'+':
OPND=Push(OPND,(b+a)+48);
break;
case'-':
OPND=Push(OPND,(b-a)+48);
break;
}
}
elseif(sub(str[i])==2)
{
OPTR=Pop(OPTR,&t);
OPND=Pop(OPND,&a);
OPND=Pop(OPND,&b);
a=a-48;
b=b-48;
switch(t)
{
case'*':
OPND=Push(OPND,b*a+48);
break;
case'/':
OPND=Push(OPND,b/a+48);
break;
}
}
}
elseif(sub(str[i]) { if(sub(Gettop(OPTR))==3) { OPTR=Push(OPTR,str[i]); i++; } elseif(sub(Gettop(OPTR))==2) { OPTR=Pop(OPTR,&t); OPND=Pop(OPND,&a); OPND=Pop(OPND,&b); a=a-48; b=b-48; switch(t) { case'*': OPND=Push(OPND,b*a+48); break; case'/': OPND=Push(OPND,b/a+48); break; } } elseif(sub(Gettop(OPTR))==1) { OPTR=Pop(OPTR,&t); OPND=Pop(OPND,&a); OPND=Pop(OPND,&b); a=a-48; b=b-48; switch(t) { case'+': OPND=Push(OPND,(b+a)+48); break; case'-': OPND=Push(OPND,(b-a)+48); break; } } elseif(sub(Gettop(OPTR))==4) { while(Gettop(OPTR)! ='(') { if(Gettop(OPTR)==')') { OPTR=Pop(OPTR,&t); OPND=Pop(OPND,&temp[j]); } elseif(Gettop(OPTR)=='+'||Gettop(OPTR)=='-'||Gettop(OPTR)=='*'||Gettop(OPTR)=='/') { j++; OPTR=Pop(OPTR,&temp[j]); j++; OPND=Pop(OPND,&temp[j]); } } OPTR=Pop(OPTR,&t); if(j==4) { printf("Expressioninbracketis: "); while(j>=0) { printf("%c",temp[j]); j--; } printf("\n"); if(temp[1]=='*') { temp[0]-=48; temp[2]-=48; c=temp[0]*temp[2]+48; } elseif(temp[1]=='/') { temp[0]-=48; temp[2]-=48; c=temp[2]/temp[0]+48; } if(temp[3]=='+') { temp[4]-=48; c-=48; c=(c+temp[4])+48; } elseif(temp[3]=='-') { temp[4]-=48; c-=48; c=(temp[4]-c)+48; } OPND=Push(OPND,c); } if(j==2) { printf("Expressioninbracketis: "); while(j>=0) { printf("%c",temp[j]); j--; } printf("\n"); temp[0]-=48; temp[2]-=48; switch(temp[1]) { case'+': OPND=Push(OPND,(temp[2]+temp[0])+48); break; case'-': OPND=Push(OPND,(temp[2]-temp[0])+48); break; case'*': OPND=Push(OPND,temp[2]*temp[0]+48); break; case'/': OPND=Push(OPND,temp[2]/temp[0]+48); break; } } } } } } } while(str[k]! ='#') { printf("%c",str[k]); k++; } printf("=%d",Gettop(OPND)-48); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 资料