簡單表示式求值 算符優先法

2021-08-27 07:01:01 字數 2136 閱讀 6050

周五加班的時候,在九度oj上練習了一道簡單表示式求值的題目,用到了「算符優先法」,這裡簡單的記錄一下

讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。

測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。

對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。

1 + 2

4 + 2 * 5 - 7 / 11

0

3.00

13.36

對表示式 4 + 2 × 5 - 7 / 11進行計算,需要了解演算法四則運算的規則,即:

1.先乘除,後加減

2.從左到右計算

(1)為了實現算符優先法,可以使用兩個工作棧。乙個稱作optr,用以寄存運算子;另乙個稱為oprd,用以寄存運算元或者運算結果。

(2)初始化兩個棧,並且置棧空。(假設表示式是沒有語法錯誤的)

(3)依次讀入表示式中每個字元,若是運算元則進optd棧,若是運算子,則和optr棧的棧頂運算子比較優先權後作相應操作,直至整個表示式求值完畢(即表示式指標到了最後乙個字元並且optr棧為空)

#include #include #include #define stacksize 201

struct optr

;struct optd

;void initstackoptr(struct optr *);

void initstackoptd(struct optd *);

void pushstackoptr(struct optr *, char );

void pushstackoptd(struct optd *, double );

char getstackoptrtop(struct optr *);

int compareoperator(char, char);

char popstackoptr(struct optr *);

double popstackoptd(struct optd *);

double calculatedata(double, double, char);

int main()

initstackoptr(optr);

initstackoptd(optd);

//計算表示式的值,使用「算符優先法」

for(i = 0; i < len; i ++)

//運算元進棧

pushstackoptd(optd, x);

}else}}

} //判斷算符棧是否為空

while(optr -> top != 0)

//輸出計算結果

printf("%.2lf\n",sum);

} return 0;

}void initstackoptr(struct optr *s)

void initstackoptd(struct optd *s)

void pushstackoptr(struct optr *s, char opt)

s->operator[s->top ++] = opt;

}void pushstackoptd(struct optd *s, double x)

s->data[s->top ++] = x;

}char getstackoptrtop(struct optr *s)

return s->operator[s->top - 1];

}int compareoperator(char opt1, char opt2)

return flag;

}char popstackoptr(struct optr *s)

return s->operator[-- s->top];

}double popstackoptd(struct optd *s)

return s->data[-- s->top];

}double calculatedata(double data1, double data2, char operator)

return data2 / data1;

}}

算術表示式求值 「算符優先順序法」 「字尾表示式法」

該方法來自嚴蔚敏版資料結構,基本思路是 設定兩個工作棧,乙個運算元棧,乙個操作符棧,在 自左至右 掃瞄算術表示式時,遇到運算元直接入運算元棧,若遇到操作符,則根據操作符優先順序判斷下一步操作 操作符優先順序規則 若其優先順序高於棧頂操作符,則入棧,否則 相等或小於 彈出棧頂算符並從運算元棧彈出兩個運...

資料結構 算術表示式 算符優先法

還新增了乘方的優先順序,自行參考 一開始我寫的只能輸入個位數,後來想了好久才解決,主要是在判斷是否為運算子後,若不是運算子,別急著入棧,用乙個標記陣列記著,若下乙個字元還不是運算子,則利用strcat函式鏈結之前標記陣列和這乙個字元,直到下乙個字元是運算子為止,才入棧。至於負數的運算,則要判斷是否連...

數算A 表示式 表示式樹 表示式求值

這道題在輸出上太坑了,畫出來不像樹.1 include2 include3 include4 using namespace std 5int val 26 n,len,ans,maxdep 6char infix 55 postfix 55 out 50 300 7 struct node 13 ...