综合实验六利用栈实现表达式求解.docx

上传人:b****3 文档编号:7055203 上传时间:2023-05-11 格式:DOCX 页数:10 大小:16.42KB
下载 相关 举报
综合实验六利用栈实现表达式求解.docx_第1页
第1页 / 共10页
综合实验六利用栈实现表达式求解.docx_第2页
第2页 / 共10页
综合实验六利用栈实现表达式求解.docx_第3页
第3页 / 共10页
综合实验六利用栈实现表达式求解.docx_第4页
第4页 / 共10页
综合实验六利用栈实现表达式求解.docx_第5页
第5页 / 共10页
综合实验六利用栈实现表达式求解.docx_第6页
第6页 / 共10页
综合实验六利用栈实现表达式求解.docx_第7页
第7页 / 共10页
综合实验六利用栈实现表达式求解.docx_第8页
第8页 / 共10页
综合实验六利用栈实现表达式求解.docx_第9页
第9页 / 共10页
综合实验六利用栈实现表达式求解.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

综合实验六利用栈实现表达式求解.docx

《综合实验六利用栈实现表达式求解.docx》由会员分享,可在线阅读,更多相关《综合实验六利用栈实现表达式求解.docx(10页珍藏版)》请在冰点文库上搜索。

综合实验六利用栈实现表达式求解.docx

综合实验六利用栈实现表达式求解

综合实验六利用栈实现表达式求解

一、实验名称

利用栈实现表达式求解

二、实验目的

1、熟悉并栈的数据结构的实现与操作

2、掌握栈的典型应用—利用栈实现表达式求解

三、实验内容及要求:

实验内容

问题描述:

输入一个表达式,按如下要求完成其求值运算:

(1)表达式中允许有两种括号:

(、)、[、],请验证其匹配成对的合法性

(2)运算符限定于加减乘除四种运算,请验证表达式是否书写合法,如:

3+2-*5就不是一个合法表达式。

(3)使用栈的原理实现表达式求值。

(4)尽量考虑参与运算的数是非1位数,如:

234+32*12

根据以上问题给出的以下存储结构定义:

#definestack_init_size100//定义栈的最大初始化容量

#definestackincreament10//定义栈的增量

#defineoverflow-2

typedefstruct{

char*base;

char*top;

intstacksize;

}Sqstackcha;//定义存放运算符号的栈的数据类型。

typedefstruct{

double*base;

double*top;

intstacksize;

}Sqstackdou;//定义存放操作数或中间结果的栈的数据类型、。

Sqstackchaoptr;

Sqstackdouopnd;

――――――――――定义基本操作的函数说明―――――――――――――

chargettop(Sqstackcha&s);//取操作符栈顶元素

doublegettop(Sqstackdou&s);;//取操作数栈顶元素

intprecede(Sqstackcha&s,charc);//比较字符c与操作符栈顶元素的优先级

voidinitstack(Sqstackcha&s);//初始化操作符栈

voidinitstack(Sqstackdou&s);//初始化操作数栈

doubleopterate(doublea,chartheta,doubleb);//对操作数a和b用操作符运行其结果

voidpush(Sqstackcha&s,chare);//操作符入栈

voidpush(Sqstackdou&s,doublee);//操作数入栈

charpop(Sqstackcha&s,chare);//操作符出栈

doublepop(Sqstackdou&s,doublee);//操作符出栈

实验要求

(1)、用C语言编程实现上述实验内容中的结构定义和算法。

(2)、要有main()函数,并且在main()函数中使用检测数据调用上述算法。

(3)、实验完成后撰写实验报告,实验报告的具体格式参见《实验报告须知》。

(4)、实验完成后把打印好的实验报告以及电子版的实验报告和源程序一并上交。

参考源代码:

#include

#include

#definestack_init_size100//定义栈的最大初始化容量

#definestackincreament10//定义栈的增量

#defineoverflow-2

typedefstruct{

char*base;

char*top;

intstacksize;

}Sqstackcha;//定义存放运算符号的栈的数据类型。

typedefstruct{

double*base;

double*top;

intstacksize;

}Sqstackdou;//定义存放操作数或中间结果的栈的数据类型、。

Sqstackchaoptr;

Sqstackdouopnd;

//******************************************

chargettop(Sqstackcha&s);

doublegettop(Sqstackdou&s);

intprecede(Sqstackcha&s,charc);

voidinitstack(Sqstackcha&s);

voidinitstack(Sqstackdou&s);

doubleopterate(doublea,chartheta,doubleb);

voidpush(Sqstackcha&s,chare);

voidpush(Sqstackdou&s,doublee);

charpop(Sqstackcha&s,chare);

doublepop(Sqstackdou&s,doublee);

voidinitstack(Sqstackcha&s)

//初始化字符型栈

{

s.base=(char*)malloc(stack_init_size*sizeof(char));

if(!

s.base)

{

cout<<"e";

exit(overflow);

}

s.top=s.base;

s.stacksize=stack_init_size;

}

voidinitstack(Sqstackdou&s)

//初始化double型栈

{

s.base=(double*)malloc(stack_init_size*sizeof(double));

if(!

s.base)exit(overflow);

s.top=s.base;

s.stacksize=stack_init_size;

}

 

voidpush(Sqstackcha&s,chare)

//操作符栈操作。

{

if(s.top-s.base>=s.stacksize){

s.base=(char*)realloc(s.base,

(s.stacksize+stackincreament)*sizeof(char));

if(!

s.base)exit(overflow);

s.stacksize+=stackincreament;

}

*s.top++=e;

}

voidpush(Sqstackdou&s,doublee)

//操作数进栈操作。

{

if(s.top-s.base>=s.stacksize){

s.base=(double*)realloc(s.base,

(s.stacksize+stackincreament)*sizeof(double));

if(!

s.base){

exit(overflow);

}

s.stacksize+=stackincreament;

}

*s.top++=e;

}

chargettop(Sqstackcha&s)

//取操作符栈栈顶元素

{

chare;

if(s.top==s.base){

exit(overflow);

}

e=*(s.top-1);

returne;

}

doublegettop(Sqstackdou&s)

//取操作数栈栈顶元素

{

doublee;

if(s.top==s.base){

exit(overflow);

}

e=*(s.top-1);

returne;

}

//********************************************

charpop(Sqstackcha&s,chare)

//操作符出栈操作

{

if(s.top==s.base){

cout<<"e";

exit(overflow);

}

e=*--s.top;

returne;

}

doublepop(Sqstackdou&s,doublee)

//操作数出栈操作

{

if(s.top==s.base){

exit(overflow);

}

e=*--s.top;

returne;

}

intprecede(Sqstackcha&s,charc)

//对运算符优先级的判断函数

{

intflag;

chara1;

a1=gettop(optr);

switch(a1){

case'+':

if(c=='*'||c=='/'||c=='(')

flag=-1;

else

if(c=='+'||c=='-'||c==')'||c=='#')

flag=1;

break;

case'-':

if(c=='*'||c=='/'||c=='(')

flag=-1;

else

if(c=='+'||c=='-'||c==')'||c=='#')

flag=1;

break;

case'*':

if(c=='(')

flag=-1;

else

if(c=='+'||c=='-'||c=='*'||c=='/'||c==')'||c=='#')

flag=1;

break;

case'/':

if(c=='(')

flag=-1;

else

flag=1;

break;

case'(':

if(c==')')

flag=0;

else

if(c=='#'){

cout<<"输入的表达式不正确!

"<

exit(0);

}

else

flag=-1;

break;

case')':

if(c=='(')

{

cout<<"输入的表达式不正确!

"<

exit(0);

}

else

flag=1;

break;

case'#':

if(c=='#')

flag=0;

else

if(c==')'){

cout<<"输入的表达式不正确!

"<

exit(0);

}

else

flag=-1;

break;

}

returnflag;

}

doubleopterate(doublea,chartheta,doubleb)

//double型数之间的基本运算函数

{

doublec;

switch(theta){

case'+':

c=a+b;

break;

case'-':

c=a-b;

break;

case'*':

c=a*b;

break;

case'/':

c=a/b;

break;

}

returnc;

}

//主函数。

voidmain(){

doublex,y,z,a,b;

charr,theta,s;

cout<<"请输入计算表达式并以'#'结束:

";

initstack(optr);

push(optr,'#');

initstack(opnd);

cin.get(r);

while(r!

='#'||gettop(optr)!

='#'){

if(r>='0'&&r<='9')

{

x=0;

while(r<='9'&&r>='0')

{

x=x*10+r-'0';

cin.get(r);

}

push(opnd,x);

}

else

switch(precede(optr,r))

{

case-1:

push(optr,r);

cin.get(r);

break;

case0:

pop(optr,theta);

cin.get(r);

break;

case1:

s=pop(optr,theta);

y=pop(opnd,b);

z=pop(opnd,a);

push(opnd,opterate(z,s,y));

break;

}

}

cout<<"计算表达式的值为:

";

cout<

}

四、运行测试(略)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2