题解 | #表达式求值#

表达式求值

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); 
}
全部评论

相关推荐

挣K存W养DOG:他真的很中意你,为什么不回他
点赞 评论 收藏
分享
09-29 11:19
门头沟学院 Java
点赞 评论 收藏
分享
31 6 评论
分享
牛客网
牛客企业服务