n=shuzi[i]*k;
k=k/10;
number+=n;
}
Push2(&L2,number);
m=0;
}
switch(FuHao(GetTop1(&L1),c))//判断当前运算符与栈顶运算符的大小关系
{
case-1:
Push1(&L1,c);
oldnum=c;
c=getchar();
cishu=1;//读取一个新字符就改变其cishu
break;
case0:
Pop1(&L1,&x);
oldnum=c;
c=getchar();
cishu=1;//读取一个新字符就改变其cishu
break;
case1:
Pop1(&L1,&x);
Pop2(&L2,&b);
Pop2(&L2,&a);
cishu=2;//由于没有读取新字符即当前运算符会在下一次循环中再次用到,因此改变其cushu为2
Push2(&L2,Operate(a,x,b));
break;
}
}
}
Pop2(&L2,&answer);//读取最终结果
printf("\n%d",answer);
getch();
}
(2)构造存储运算符间大小关系的数组
voidSuanFu()
{
inti,j;
for(i=0;i<=3;i++){
for(j=0;j<=1;j++){
suanfu[i][j]=1;
}
}
for(i=0;i<=1;i++){
for(j=2;j<=3;j++){
suanfu[i][j]=-1;}
}
for(i=2;i<=3;i++){
for(j=2;j<=3;j++){
suanfu[i][j]=1;
}
}
for(i=4;i<=4;i++){
for(j=0;j<=3;j++){
suanfu[i][j]=-1;}
}
for(i=5;i<=5;i++){
for(j=0;j<=3;j++){
suanfu[i][j]=1;}
}
for(i=6;i<=6;i++){
for(j=0;j<=3;j++){
suanfu[i][j]=-1;}
}
for(i=0;i<=6;i++)
{suanfu[i][4]=-1;}
for(i=0;i<=5;i++)
{suanfu[i][5]=1;}
for(i=0;i<=6;i++)
{suanfu[i][6]=1;}
suanfu[4][6]=22;
suanfu[6][6]=0;
suanfu[5][4]=22;
suanfu[4][5]=0;
}
(3)构造判断啊a,b字符大小关系的函数
intFuHao(chara,charb)
{
if(a=='+')
{
if(b=='+')returnsuanfu[0][0];
if(b=='-')returnsuanfu[0][1];
if(b=='*')returnsuanfu[0][2];
if(b=='/')returnsuanfu[0][3];
if(b=='(')returnsuanfu[0][4];
if(b==')')returnsuanfu[0][5];
if(b=='#')returnsuanfu[0][6];
}
if(a=='-')
{
if(b=='+')returnsuanfu[1][0];
if(b=='-')returnsuanfu[1][1];
if(b=='*')returnsuanfu[1][2];
if(b=='/')returnsuanfu[1][3];
if(b=='(')returnsuanfu[1][4];
if(b==')')returnsuanfu[1][5];
if(b=='#')returnsuanfu[1][6];
}
if(a=='*')
{
if(b=='+')returnsuanfu[2][0];
if(b=='-')returnsuanfu[2][1];
if(b=='*')returnsuanfu[2][2];
if(b=='/')returnsuanfu[2][3];
if(b=='(')returnsuanfu[2][4];
if(b==')')returnsuanfu[2][5];
if(b=='#')returnsuanfu[2][6];
}
if(a=='/')
{
if(b=='+')returnsuanfu[3][0];
if(b=='-')returnsuanfu[3][1];
if(b=='*')returnsuanfu[3][2];
if(b=='/')returnsuanfu[3][3];
if(b=='(')returnsuanfu[3][4];
if(b==')')returnsuanfu[3][5];
if(b=='#')returnsuanfu[3][6];
}
if(a=='(')
{
if(b=='+')returnsuanfu[4][0];
if(b=='-')returnsuanfu[4][1];
if(b=='*')returnsuanfu[4][2];
if(b=='/')returnsuanfu[4][3];
if(b=='(')returnsuanfu[4][4];
if(b==')')returnsuanfu[4][5];
if(b=='#')returnsuanfu[4][6];
}
if(a==')')
{
if(b=='+')returnsuanfu[5][0];
if(b=='-')returnsuanfu[5][1];
if(b=='*')returnsuanfu[5][2];
if(b=='/')returnsuanfu[5][3];
if(b=='(')returnsuanfu[5][4];
if(b==')')returnsuanfu[5][5];
if(b=='#')returnsuanfu[5][6];
}
if(a=='#')
{
if(b=='+')returnsuanfu[6][0];
if(b=='-')returnsuanfu[6][1];
if(b=='*')returnsuanfu[6][2];
if(b=='/')returnsuanfu[6][3];
if(b=='(')returnsuanfu[6][4];
if(b==')')returnsuanfu[6][5];
if(b=='#')returnsuanfu[6][6];
}
}
(4)构造判断c是否为运算符的函数
intIn(charc)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return1;
elsereturn0;
}
(5)构造进行基本运算的函数
intOperate(inta,charc,intb)/*NOProblem*/
{
intd;
if(c=='+')
d=a+b;
if(c=='-')
d=a-b;
if(c=='*')
d=a*b;
if(c=='/')
d=a/b;
returnd;
}
(6)伪码变成c语言码示例(传入一个指向结构体的指针引用此函数时传入结构体的地址如:
&L1)
voidPush1(SqStack1*L1,SElemType1e)//进栈
{
if((*L1).top-(*L1).base>=(*L1).stacksize){(*L1).base=(SElemType1*)realloc((*L1).base,((*L1).stacksize+STACKINCREAMENT)*sizeof(SElemType1));
(*L1).top=(*L1).base+(*L1).stacksize;
(*L1).stacksize+=STACKINCREAMENT;
}
*((*L1).top++)=e;
}
voidPop1(SqStack1*L1,SElemType1*e)//出栈
{
*e=*((*L1).top-1);
(*L1).top--;
}
∙函数的调用关系:
Main
SuanFu
InitStack1InitStack2Push1Push2GetTop1GetTop2Pop1Pop2OperateIn
∙调试分析
∙对于InitStack1(SqStack1*L1)的引用,我开始写成了InitStack1(L1),没有传入L1的地址,出现错误,后来改为InitStack1(&L1),错误消失
∙对于Push1(SqStack1*L1,SElemType1e)的内部写法,我开始写的是
if(*L1.top-*L1.base>=*L1.stacksize)…
*L1.top=*L1.base+*L1.stacksize;之类的,出现了代码无效的错误
经改正:
if(*L1.top-(*L1).base>=(*L1).stacksize)
(*L1).top=(*L1).base+(*L1).stacksize;错误消失
3.开始一直出现警告没去管,结果输出的最终结果总是很大的数字,经过仔细的修改传入指针之类的程序,搞定了警告,输出结果就正确了,可见警告是不可忽视和笑看的!
!
!
4.开始对于SuanFu()开始构造的是字符型”>”“<”“=”,所以对于FuHao(chara,charb),返回的就是字符型,出现错误,因为不能return字符型,只能return整型,于是将”>”“<”“=”改为”1””-1””0”,错误消失
用户手册
∙本程序的运行怀镜为WindowsXp/2000操作系统,执行文件名为:
栈的应用(表达式求值).exe。
∙
进入演示程序后即显示文本方式的用户界面:
∙进入主函数命令后,即提示键入您欲进行运算的表达式(以#作为表达式的结束标志),总的结束符为回车。
∙测试结果
执行命令Pleaseenterthenumberandtheoprater(end-#):
键入1+2#后,输出结果3
重新执行命令Pleaseenterthenumberandtheoprater(end-#):
键入1+2*3#后,输出结果7
重新执行命令Pleaseenterthenumberandtheoprater(end-#):
键入137*(24+6)-137*(15+15)#后,输出结果0
重新执行命令Pleaseenterthenumberandtheoprater(end-#):
键入128*(4+3*2)#后,输出结果1280
重新执行命令Pleaseenterthenumberandtheoprater(end-#):
键入12-160#后,输出结果-138