周五加班的時候,在九度oj上練習了一道簡單表示式求值的題目,用到了「算符優先法」,這裡簡單的記錄一下
讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
1 + 24 + 2 * 5 - 7 / 11
0
3.0013.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 ...