- 注册时间
- 2004-10-13
- 最后登录
- 2019-5-15
⑧专业
*永恒国度*
- 积分
- 14145
|
求一表达式的值: 先将算术表达式转换成后缀表达式,然后对后缀表达式求值
以字符形式输入,存放在字符型数组str中,后缀表达式存放在字符型数组exp中,将算术表达式转换成后缀表达式过程中用字符型数组stack作为栈.操作如下:
1.若ch 为数字,后后续所有数字依次存入数组exp,并以字符 # 标志数字结束
2.若ch为左括号 ( 将特号插入栈 stack
3.若ch 为右括号 ) 将栈stack中左括号 以前的字符依次删除并存入数组exp中,后将左括号 ( 删除
4.若ch 为+,- ,将当前栈stack 中左括号以前的所有字符(运算符)依次删除并存入数组exp中,然后将ch
插入栈stack中
5.若ch 为 *, / 将当前栈stack中的栈顶端连续的 * , / 删除并依次存入数组exp中,然后ch插入栈stack
中,
6.若ch为 # 将栈stack的所有运算符依次删除并存入数组exp中,再将ch 存入数组exp中,最后在exp
得出表达式后缀表示.- #include<stdio.h>
- #define MAX 100
- char exp[MAX];
- void trans() // 将算术表达式转换成后缀表达式
- {
- char str[MAX]; // 存储原算术表达式
- char stack[MAX]; // 作栈使用
- char ch; [color=#FF0000]问题一:为什么下标以一为开始呢?[/color] int sum,i,j,t,top=0; // t 为 exp的下标,top 作stack的下标,i作str的下标
- printf("**********************8**************************************\n");
- printf("*输入一个求值的表达式,以#结束。只能包含+-*/运算符和正整数*\n");
- printf("**************************************************************\n");
- printf("算术表达式:");
- i=0;
- do // 获取用户输入的表达式
- {
- i++;
- scanf("%c",&str[i]);
- }while(str[i]!='#' && i!=MAX);
- sum=i; // 记录输入表达式总的字符数
- t=1;i=1;
- ch=str[i];i++;
- while(ch!='#')
- {
- switch(ch)
- {
- case '(': // 判定为左括号
- top++;stack[top]=ch;break;
- case ')': // 判定为右括号
- while(stack[top]!='(')
- {
- exp[t]=stack[top];top--;t++;
- }
- top--;
- break; [color=#FF0000]问题二:这里开始,下面的top都是top++,为什么呢?[/color]
- case '+': // 判定为加减号
- case '-':
- while(top!=0 && stack[top]!='(')
- {
- exp[t]=stack[top];top--;t++;
- }
- top++;stack[top]=ch;
- break;
- case '*': // 判定为乘除号
- case '/':
- while(stack[top]=='*' || stack[top]=='/')
- {
- exp[t]=stack[top];top--;t++;
- }
- top++;stack[top]=ch;
- break;
- case ' ':break;
- default:while(ch>='0' && ch<='9') // 判定为数字
- {
- exp[t]=ch;t++;
- ch=str[i];i++;
- }
- i--;
- exp[t]='#';t++;
- }
- ch=str[i];i++;
- }
- while(top!=0)
- {
- exp[t]=stack[top];t++;top--;
- }
- exp[t]='#';
- printf("\n\t原来表达式:");
- for(j=1;j<sum;j++) printf("%c",str[j]);
- printf("\n\t后缀表达式:",exp);
- for(j=1;j<t;j++) printf("%c",exp[j]);
- }
- void compvalue() // 计算后缀表达式的值
- {
- float stack[MAX],d; // 作为栈使用
- char ch;
- int t=1,top=0; // t作为exp的下标,top作为stack的下标
- ch=exp[t];t++;
- while(ch!='#') [color=#FF0000]问题三:这里是以数组exp所以经过数字就会有#为什么可以历遍整个表达式呢?[/color] {
- switch(ch)
- {
- case '+':stack[top-1]=stack[top-1]+stack[top];
- top--;break;
- case '-':stack[top-1]=stack[top-1]-stack[top];
- top--;break;
- case '*':stack[top-1]=stack[top-1]*stack[top];
- top--;break;
- case '/':
- if(stack[top]!=0)
- stack[top-1]=stack[top-1]/stack[top];
- else
- {
- printf("\n\t除零错误!\n");
- exit(0);
- }
- top--;break;
- default:d=0;
- while(ch>='0' && ch<='9') // 判定为数字字符
- {
- [color=#FF0000] 问题四:这里的d置0这样的表达式好像没啥意义吧?[/color]
- d=10*d+ch-'0'; // 将数字字符转换成对应数值
- ch=exp[t];t++;
- }
- top++;
- stack[top]=d;
- }
- ch=exp[t];t++;
- }
- printf("\n\t计算结果:%g\n",stack[top]);
- }
- void main()
- {
- trans();
- compvalue();
- }
- 输入表达式(56-20)/(4+2)#
- 原表达式:(56-20)/(4+2)
- 后缀表达式:56#20#-4#2#+/
- 结果:6
复制代码 总的来说对这例子整个运行过程都不太理解,请指点一下吧[s:6][s:6] |
|