下载此文档

数据结构课程设计-利用栈求表达式的值.doc


文档分类:IT计算机 | 页数:约29页 举报非法文档有奖
1/29
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/29 下载此文档
文档列表 文档介绍
该【数据结构课程设计-利用栈求表达式的值 】是由【读书百遍】上传分享,文档一共【29】页,该文档可以免费在线阅读,需要了解更多关于【数据结构课程设计-利用栈求表达式的值 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。课程设计报告
题目十三、运用栈求体现式的值
设计任务与目的
编写程序实现体现式求值,即验证某算术体现式的对的性,若对的,则计算该算术体现式的值。
重要功能描述如下:
1、从键盘上输入体现式,以“=”号结束体现式。
2、分析该体现式与否合法:
(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。
(2)是规定的运算符,则根据规则进行解决。在解决过程中,将计算该体现式的值。
(3)若是其他字符,则返回错误信息。
3、若上述解决过程中没有发现错误,则觉得该体现式合法,并打印解决成果。
附加功能:
规定体现式的合法性
小数计算
计算记录的保存与查看
(1)规定体现式的合法性,括号配对,不能浮现“6++3”、“6+-3”等符号重叠的状况。
(2)体现式开头只能是数字或“(”,体现式中只能有一种“=”。
程序中应重要涉及下面几种功能函数:
voidinitstack():初始化堆栈
intmake_str():语法检查并计算
intpush_num(doublenum):将操作数压入堆栈
charprocede(chartop,charcode):解决操作码
intchange_opnd(intoperate):将字符型操作码转换成优先级
intchange_opnd(charcode):将操作码压入堆栈
charpop_opnd(opnd*op):将操作码弹出堆栈
intcaculate(intcur_opnd):简朴计算+,-,*,/
doublepop_num(num*nu):弹出操作数
方案设计与论证
定义一种expression全局体现式构造体expr[1000]寄存计算过的体现式(expstr[MAXSIZE])和计算成果(result)、一种计量器(i)、一种体现式字符串、一种操作码栈和一种操作数栈;
把体现式字符串从头到尾逐个扫描,将输入的体现式进行语法检查;
第一种字符只能是数字或“(”,最重一种字符只能是“=”;
体现式括号必须配对,中间不能浮现“=”;
在“(”前面只能是“+、-、*、/、(”,在“+、-、*、/、=、)”前面只能是数字或“)”;
把体现式字符串从头到尾逐个扫描,直到体现式扫描完毕,操作码栈为空;
把字符根据运算优先级别选择操作;
把体现式中的数值部分字符串转成数值压入操作数栈;
是“(”直接压入到操作码栈,级别比操作码栈顶元素高的,把运算符压入操作码栈;
级别比操作码栈低的,弹出操作码栈的栈顶元素和操作数栈的两个栈顶元素,进行运算后再压入操作数栈;
是“)”,若操作码栈顶是“(”,把弹出操作码栈顶元素,否则“)”视为级别最低的元素,反复7;
最后计算出成果并将其寄存在expr[i],计量器加1;
反复计算后,将成果保存在文献里,并记录计算次数;
查看多次计算成果,以表形式输出;
查看本次计算记录,以表形式输出;
清除计算记录,重新计算。
算法阐明
程序总共有如下函数:
重要函数:
voidstart(opnd*op,num*nu)//程序主菜单
voidstart2(opnd*op,num*nu)//第二层计算选择,子菜单
voidload()//显示所有计算记录
voidsave()//保存计算成果
voidcheck()//显示本次计算成果
voidresult(opnd*op,num*nu)//计算成果
doublecaculate(opnd*op,num*nu)//简朴计算+,-,*,/
体现式解决函数:
intmake_str()//语法检查
doublechange_num(charstr[])//数字字符串转成double型数字
charprocede(chartop,charcode)//解决操作码,判断栈的操作
intchange_opnd(charcode)//字符型操作码转换优先级,非体现式字符返回-2
栈操作函数:
doubleget_num(num*nu)//查看操作数栈栈顶
doublepop_num(num*nu)//操作数栈出栈
intpush_num(num*nu,doubleda)//压入操作数栈
intempty_num(num*nu)//判空
voidinitstack(num*nu)
charget_opnd(opnd*op)//查看栈顶
charpop_opnd(opnd*op)//出栈
intpush_opnd(opnd*op,charco)//压栈
intempty_opnd(opnd*op)//判空
voidinitstack(opnd*op)//初始化栈
函数间的调用关系:
main():主函数→start();
↗load()→start();
start()程序模式函数→清空文献→exit();
↘make_str()→result(op,nu)→start2()→start();
↗load→start();
start2()子菜单→save()→start2();
↘check()→start2();
result(op,nu)计算成果→initstack(op)→initstack(nu)→push_opnd(op,'=')→
↗push_num(nu,change_num(str2));
→change_opnd(*ps)↗push_opnd(op,*ps);
↘procede(get_opnd(op),*ps)→pop_opnd(op);
↘push_num(nu,caculate(op,nu))
caculate(op,nu)→b=pop_num(nu)→a=pop_num(nu)→pop_opnd(op)
main()函数:调用了一种函数start(),start()判断执行查看所有计算记录函数load(),或是清空以往的所有计算记录,或是退出程序,或是检查输入体现式语法make_str()并计算体现式result(op,nu)的操作。
result(op,nu)函数:是计算体现式,调用了初始化栈函数和字符级别判断change_opnd(*ps),若是数字,则调用转化数字change_num(str2)然后压入操作数栈,若是运算符,刚调用判断操作procede(get_opnd(op),*ps),若是
“<”,则压入操作码栈push_opnd(op,*ps),若是“=”,则弹出操作码栈顶pop_opnd(op),若是“>”,则弹出操作码栈的栈顶元素和操作数栈的两个栈顶元素,进行运算caculate(op,nu)后再压入操作数栈,计算完毕后按start()顺序运营。
start2()函数:在计算成果后调用跟随的选择菜单,进行查当作果check()、保存成果save()、查看计算记录load()、回到主菜单的操作。
流程图:
load()
main
start()
result()
save()
ClearFile
Exit()
Start2()
check()
所有源程序清单
#include<>
#include<>
#include<>
#include<>
#defineMAXSIZE100
#defineN1000
inti=0; //体现式数
structexpression//体现式构造
{
longdoubleresult;
charexpstr[MAXSIZE];
}expr[N];//体现式的一种整体容器s
typedefstruct//操作码栈定义
{
charcode[MAXSIZE];
inttop;
}opnd;
typedefstruct//操作数栈定义
{
doubledate[MAXSIZE];
inttop;
}num;
//《——opnd栈操作——》:
voidinitstack(opnd*op)//初始化栈
{
op->top=-1;
}
intempty_opnd(opnd*op)//判空
{
if(op->top==-1)
return0;
elsereturn1;
}
intpush_opnd(opnd*op,charco)//压栈
{
if(op->top==MAXSIZE-1)
{
printf("The\"opnd\"stackisfull.");
return0;
}
op->top++;
op->code[op->top]=co;
return1;
}
charpop_opnd(opnd*op)//出栈
{
chara='\0';
if(op->top==-1)
{
printf("error:The\"opnd\"stackisempty.");
returna;
}
a=op->code[op->top];
op->top--;
returna;
}
charget_opnd(opnd*op)//查看栈顶
{
chara='\0';
if(op->top==-1)
{
printf("error:The\"opnd\"stackisempty.");
returna;
}
else
returnop->code[op->top];
}
//《——num栈操作——》:
voidinitstack(num*nu)
{
nu->top=-1;
}
intempty_num(num*nu)//判空
{
if(nu->top==-1)
return0;
elsereturn1;
}
intpush_num(num*nu,doubleda)//压栈
{
if(nu->top==MAXSIZE-1)
{
printf("error:The\"date\"stackisfull.");
return0;
}
nu->top++;
nu->date[nu->top]=da;
return1;
}
doublepop_num(num*nu)//出栈
{
doublea='\0';
if(nu->top==-1)
{
printf("error:The\"date\"stackisempty.");
returna;
}
a=nu->date[nu->top];
nu->top--;
returna;
}
doubleget_num(num*nu)//查看栈顶
{
if(nu->top!=-1)
returnnu->date[nu->top];
}
//《——结束栈定义操作——》
//《——函数操作——》:
intchange_opnd(charcode)//将字符型操作码转换成优先级,非体现式字符反回-2

数据结构课程设计-利用栈求表达式的值 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数29
  • 收藏数0 收藏
  • 顶次数0
  • 上传人读书百遍
  • 文件大小81 KB
  • 时间2022-12-07