计算器(calculator)~算法竞赛入门(3-4)

编写程序,读入一行恰好包括一个加号、减号、乘号或除号的表达式,输出它的值。这个运算符保证是二元运算符,且两个运算数均为不超过100的非负整数。运算数和运算符可以紧挨着,也可以用一个或多个空格、TAB隔开。行首末尾均可以有空格。提示:选择适合的输入方法可以将问题简化。

样例输入:1+1

                     2-     5

                     0    *1982

样例输出: 2

                    -3

                     0

<span style="font-family:Arial;font-size:14px;">#include<stdio.h>
#define MAX 100
char mark[6]={'=','+','-','*','/','\n'};
int llevel[6]={-1,1,1,2,2,0};//记录相对应的运算符的左优先级
int rlevel[6]={-1,2,2,3,3,0};//记录相对应的运算符的右优先级
int main(){
    char c;
    int t=0;
    int num[MAX];//存储数字
    char st[MAX];// 存储运算符
    st[0]='=';
    int n=-1;
    int sn=0;
    while((c=getchar())!=EOF){
            if(c>='0'&&c<='9'){
                t=t*10+(c-'0');
            }
            else if(c=='+'||c=='-'||c=='*'||c=='/'||c=='\n'){
                num[++n]=t;
                t=0;
                int i;
                int left;
                int right;
                for(i=0;i<6;i++){//分别寻找左优先级和右优先级
                    if(c==mark[i]){
                       right=i;
                    }
                    if(st[sn]==mark[i])
                        left=i;
                }
                /**1.当右优先级高于左优先级时进栈,低于时出栈顶元素操作符,直到右优先级高于左优先级*/
                /**2.判定栈顶的运算符是否为'=’且右运算符是否为'\n',是则输出num最低层的元素,否则继续读取字符*/
                if(llevel[left]<rlevel[right])
                    st[++sn]=c;
                else{
                    while(1){
                        if(st[sn]=='-'){
                            sn--;
                            num[n-1]=num[n-1]-num[n];
                            n=n-1;
                        }
                        else if(st[sn]=='+'){
                            sn--;
                           num[n-1]=num[n-1]+num[n];
                           n=n-1;
                        }
                        else if(st[sn]=='*'){
                             sn--;
                             num[n-1]=num[n-1]*num[n];
                             n=n-1;
                        }
                       else if(st[sn]=='/'){
                            sn--;
                             num[n-1]=num[n-1]/num[n];
                             n=n-1;
                        }
                        for(i=0;i<6;i++){
                            if(st[sn]==mark[i])
                                left=i;
                        }
                        if(rlevel[right]>llevel[left]){
                              break;
                        }
                    }
                    if(st[sn]=='='&&c=='\n')
                        printf("%d\n",num[n--]);
                }
            }
    }
    return 0;
}
</span>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章