题解 | #四则运算#

四则运算

http://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

妈耶,属实写麻了。用栈, 将中缀表达式转换为后缀表达式,再用栈求值,本身就不简单了,要写很长。没想到还塞了负数进去,真有你的
#include<stdio.h>

int isOPND(int x);//判断x是否为运算数据

typedef struct stack{
    int *base;
    int *top;
}stack;
stack s;

void push(int x);
int pop();

int compare(char x, int *y);//比较符号优先级,1为x比栈顶优先

int cal(int output[]);//计算后缀表达式的结果

int function(int i);//根据不同运算符'+', '-', '*', '/',转化为优先级,无关紧要的函数

//因为char数据范围不够,所以用int进行存储和计算。为区分运算符和运算数据,运算符以char的值存储,运算数据以 本身数值+'0' 的值存储
int main(){
    char x;
    int output[1000]={0};
    s.base=(int *)malloc(1000*sizeof(int));
    s.top=s.base;
    int i=0;
    int flag=0;//用来处理大于9的两位数输入
    int flag1=0;//用来处理莫名其妙的负数
    while(scanf("%c", &x)!=EOF){
        if(x=='\n')    break;
        if(isOPND((int)x)){
            if(flag==0){
                output[i++]=x;
                flag=1;
                flag1=1;
            }
            else{
                output[i-1]=(output[i-1]-'0')*10+x;
                flag1=1;
            }
        }
        else if(x=='-'&&flag1==0){//用来处理负数
            scanf("%c", &x);
            x=(-1)*(x-'0')+'0';
            output[i++]=x;
            flag=1;
        }
        else if(x=='('||x=='['||x=='{'){
            push((int)x);
            flag=0;
        }
        else if(x==')'||x==']'||x=='}'){
            while(*(s.top-1)!='('&&*(s.top-1)!='['&&*(s.top-1)!='{'){
                output[i++]=pop();
            }
            pop();
            flag=0;
        }
        else{
            if(compare(x, s.top-1)==1){//优先级高于栈顶
                push((int)x);
            }
            else{
                while(s.top!=s.base&&compare(x, s.top-1)!=1){
                    output[i++]=pop();
                }
                push(x);
            }
            flag=0;
        }
    }
    while(s.top!=s.base){//输出剩余的运算符
        output[i++]=pop();
    }
    printf("%d\n", cal(output));
    return 0;
}


void push(int x){
    *(s.top++)=x;
}

int pop(){
    return *(--s.top);
}

int isOPND(int x){//因为存在大于9的多位数数据,所以不能简单用字符'0'-'9'的范围来判断,故出此下策
    if(x!='+'&&x!='-'&&x!='*'&&x!='/'&&x!='('&&x!='['&&x!='{'&&x!=')'&&x!=']'&&x!='}')
        return 1;
    return 0;
}

int compare(char x, int *y){
    int x1, y1;
    x1=function((int)x);
    y1=function(*y);
    if(x1>y1)    return 1;
    else if(x1==y1)    return 0;
    else    return -1;
}

int function(int i){
    switch(i){
        case '+':
            return 1;
        case '-':
            return 1;
        case '*':
            return 2;
        case '/':
            return 2;
    }
    return 0;
}

int cal(int output[]){
    int x=0;
    int i=0;
    for( ; isOPND(output[i])==1; i++){
        push(output[i]);
    }
    for( ; output[i]!=0; i++){
        if(isOPND(output[i])==1){
            push(output[i]);
        }
        else{
            switch(output[i]){
            case '+':
                x=(*(s.top-2)-'0')+(*(s.top-1)-'0');
                pop();
                pop();
                push(x+'0');
                break;
            case '-':
                x=(*(s.top-2)-'0')-(*(s.top-1)-'0');
                pop();
                pop();
                push(x+'0');
                break;
            case '*':
                x=(*(s.top-2)-'0')*(*(s.top-1)-'0');
                pop();
                pop();
                push(x+'0');
                break;
            case '/':
                x=(*(s.top-2)-'0')/(*(s.top-1)-'0');
                pop();
                pop();
                push(x+'0');
                break;
            }
        }
    }
    return x;
}


全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务