計算器(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>



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