题解 | #表达式求值#
表达式求值
http://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
复现的大佬的答案。
(1)思路是将表达式化为若干项的和。
即将带正号的加数本身入栈。 将带负号的加数的相反数入栈。
将带乘号的元素与乘号前的元素求积后入栈。 将带除号的元素与除号前的元素求商后入栈。
再将栈中所有的元素求和。
(2)值得关注的是初始计算操作的设定、负号的处理和括号的处理。
初始计算操作设为“加”。
括号的处理则是递归调用,遇到左括号进行一个新的循环,遇到右括号结束该循环。
在递归调用中,虽然开辟了两个相同名称的储存空间,但不会占用同一块内存。所以无需担心数据被覆盖。
(3)pos赋初值,要作为全局变量,否则递归过程中都将从初值位置开始,陷入死循环。
#include<string.h>
#include<ctype.h>
int pos=0;
int result(char str[]){
int len=strlen(str);
int stack[100]={0};
int num=0;
int top=-1;
char flag='+';
while(pos<len){
if(str[pos]=='{'||str[pos]=='['||str[pos]=='('){
pos++;
num=result(str);
}
while((pos<len)&&isdigit(str[pos])){
num=num*10+(str[pos]-'0');
pos++;
}
switch(flag){
case '+':stack[++top]=num;break;
case '-':stack[++top]=-num;break;
case '*':stack[top]*=num;break;
case '/':stack[top]/=num;break;
}
if(str[pos]=='}'||str[pos]==']'||str[pos]==')'){
pos++;
break;
}
num=0;
flag=str[pos];
pos++;
}
int plus=0;
for(int i=0;i<=top;i++)
plus+=stack[i];
return plus;
}
int main(){
char strr[100]={'\0'};
scanf("%[^\n]",strr);
int computer=result(strr);
printf("%d",computer);
}