表達式求值(C/C++)

題目:

利用棧編寫表達式求值程序:輸入含有“+”、“-”、“*”、“/”四則運算的表達式,其中負數要用(0-正數)表示,並以=結束。要求輸出表達式的值。



輸入格式

第一行:一個算術表達式


輸出格式

第一行:算術表達式的值


輸入樣例

3*(9-7)=


輸出樣例

6

代碼:

#include<stdio.h>
#include<iostream>
#include<stack>
using namespace std;
int In(char ch)   // 判斷是否爲字母
{
    if(ch>=48&&ch<=57)   return 1;
    else   return 0;
}
char compare(char a,char b)  // 比較兩個符號的優先順序
{
    int i,j;
    char c[7]=  {'+','-','*','/','(',')','#'};
    char d[7][7]= {   
                {'>','>','<','<','<','>','>'},
                {'>','>','<','<','<','>','>'},
                {'>','>','>','>','<','>','>'},
                {'>','>','>','>','<','>','>'},
                {'<','<','<','<','<','=','@'},
                {'>','>','>','>','@','>','>'},
                {'<','<','<','<','<','@','='},
    };
    if(b=='=') return '>';
    for(i=0; c[i]!=a; i++);
    for(j=0; c[j]!=b; j++);
    return d[i][j];
}
int claculat(int a,char op,int b)  //  計算表達式,注意計算順序與棧的關係
{
    int m;
    if(op=='+')      m=a+b;
    if(op=='-')   m=a-b;
    if(op=='*')   m=a*b;
    if(op=='/')   m=a/b;
    return m;
}
int main()
{
    stack<int> OPND;  // 數字棧,用於存儲數據
    stack<char> OPTR; // 符號棧, 用於存儲計算符號
    char c, top, op;
    int temp,m,n, result;
    c = getchar();
    OPTR.push('#');  // 一開始時,符號棧中並沒有符號,而在接下來的循環中,需要比較兩個運算符號的優先順序,
			// 所以有必要先在符號棧中存入一個符號,而這個符號的運算級別必須小於其他符號。
    while(c!='='||OPTR.top()!='#') {   // 輸入‘=’, 則退出循環。 
        if(In(c)) {   // 輸入數字,一個一個數字輸入,轉化爲正確的數值,並存入數字棧
            temp=c-'0';
            c=getchar();
            while(In(c)) {
                temp=temp*10+c-'0';
                c=getchar();
            }
            OPND.push(temp);
        }


        else {   
            top = OPTR.top();
            switch (compare(top , c)) {
            case '<':   			//若運算極較小, 則入棧
                OPTR.push(c);
                c = getchar();
                break;
            case '=':                      //若運算級別相等(爲兩個括號) 則出棧
                OPTR.pop();
                c = getchar();
                break;
            case '>':			// 若運算級別較大,則數字棧出棧,計算兩個數字的算術結果,並存入棧中
                m = OPND.top();
                OPND.pop();
                n = OPND.top();
                OPND.pop();
                op = OPTR.top();
                OPTR.pop();
                result = claculat(n, op, m);
                OPND.push(result);
                break;
            }
        }
    }
    printf("%d\n",OPND.top());
    return 0;
}



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