如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
开始初始化运算符栈stack初始化逆波兰区exp初始化表达式区str将表达式送入表达式区str中从表达式区中取一个字符‘#’操作数‘(’运算符‘(’栈内元素送逆波兰区结束“(”入栈操作数送逆波兰区栈内运算符≥栈外运算符栈内运算符送逆波兰区栈外运算符入栈栈内元素送逆波兰区YNYNYNYYNN六、程序清单#include<stdio.h>#include<memory.h>#include<string.h>#defineMax100voidmain(){charstr[Max],exp[Max],stack[Max],ch;/*定义表达式区、逆波兰区和运算符栈*/charch1;do{inti=0,j=0,t=0,top=0,flag,flag1,flag2,flag3;//memset(str,0,strlen(str));printf("请输入表达式:(以#结束)\n");scanf("%s",str);/*将表达式送入表达式区*///printf("\n");for(i=0;i<Max;i++){if(str[i]=='#'){flag=1;break;}}if(flag==1){i=0;ch=str[i];i++;while(ch!='#')/*判断是否是表达式结束符*/{if(i==1&&ch!='('&&(ch>'z'||ch<'0'||(ch>'9'&&ch<'a'))){flag1=0;break;}else{if((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'))/*如果是操作数,把它送入逆波兰区*/{exp[t]=ch;t++;}elseif(ch=='(')/*如果是左括号,把它送入运算符栈*/{top++;stack[top]=ch;}elseif(ch==')'){while(stack[top]!='(')/*如果是右括号,把运算符栈的内容送入逆波兰区*/{exp[t]=stack[top];top--;t++;}top--;}elseif(ch=='+'||ch=='-')/*如果是运算符,栈内运算符和栈外运算符进行比较*/{while(top!=0&&stack[top]!='('){exp[t]=stack[top];top--;t++;}top++;stack[top]=ch;}elseif(ch=='*'||ch=='/'){while(stack[top]=='*'||stack[top]=='/'||stack[top]=='^'){exp[t]=stack[top];top--;t++;}top++;stack[top]=ch;}elseif(ch=='^'){while(stack[top]=='^'){exp[t]=stack[top];top--;t++;}top++;stack[top]=ch;}else{//printf("表达式有错!\n");flag2=0;break;}ch=str[i];i++;}}if(flag1!=0&&flag2!=0){while(top!=0)/*将运算符栈的内容送入逆波兰区*/{if(stack[top]!='('){exp[t]=stack[top];t++;top--;}else{flag3=0;break;}}if(flag3==0){printf("表达式有错!\n");//printf("第%i个错误!\n",i-1);}else{printf("逆波兰式输出:\n");for(j=0;j<t;j++)/*打印逆波兰式*/printf("%c",exp[j]);printf("\n");}}else{//flag1=1;printf("输入的表达式有错!\n");printf("第%d个错误\n",i);}}else{printf("输入有错(应以'#'结尾)!\n");}flag=0;flag1=1;flag2=1;flag3=1;//str[0]='#';memset(str,'/0',strlen(str));memset(exp,'/0',strlen(exp));memset(stack,'/0',strlen(stack));printf("是否继续:\n");getchar(ch1);}while(getchar(ch1)=='y'||getchar(ch1)=='Y');}七.运行结果八、问题及解决方案在实验过程中,程序在识别括号匹配时出现了问题,开始不能识别括号匹配,所以在判断括号时,加入了top=-1的情况,来判断括号