求字首表示式的值
算術表示式有字首表示法、中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2+3*(7-4)+8/4
的字首表示式是:+ + 2 * 3 - 7 4 / 8 4
。請設計程式計算字首表示式的結果值。
輸入在一行內給出不超過30個字元的字首表示式,只包含+
、-
、*
、\
以及運算數,不同物件(運算數、運算符號)之間以空格分隔。
輸出字首表示式的運算結果,保留小數點後1位,或錯誤資訊error
。
+ + 2 * 3 - 7 4 / 8 4
13.0
解題思路
首先了解一下字首表示式
字首表示式就是不含括號的算術表示式,而且它是將運算子寫在前面,
運算元寫在後面的表示式,也稱為「波蘭式」。例如,- 1 + 2 3,它等價於1-(2+3);
字首表示式如何求值
對於乙個字首表示式的求值而言,首先要從右至左掃瞄表示式,從右邊第乙個字元開始判斷,如果當前字元是數字則一直到數字串的末尾再記錄下來,如果是運算子,則將右邊離得最近的兩個「數字串」作相應的運算,以此作為乙個新的「數字串」並記錄下來。一直掃瞄到表示式的最左端時,最後運算的值也就是表示式的值。
例如,字首表示式「- 1 + 2 3「的求值,掃瞄到3時,記錄下這個數字串,掃瞄到2時,記錄下這個數字串,當掃瞄到+時,將+右移做相鄰兩數字的運算子,記為2+3,結果為5,記錄下這個新數字串,並繼續向左掃瞄,掃瞄到1時,記錄下這個數字串,掃瞄到-時,將-右移做相鄰兩數字串的運算子,記為1-5,結果為-4,
所以表示式的值為-4。
字首表示式有什麼用處
字首表示式是一種十分有用的表示式,它將中綴表示式轉換為可以依靠簡單的操作就能得到運算結果的表示式。例如,(a+b)*(c+d)轉換為 *,+,a,b,+,c,d。它的優勢在於只用兩種簡單的操作,入棧和出棧就可以解決任何中綴表示式的運算。其運算方式為:如果當前字元(或字串)為數字或變數,則壓入棧內;如果是運算子,則將棧頂兩個元素彈出棧外並作相應運算,再將結果壓入棧內。當字首表示式掃瞄結束時,棧裡的就是中綴表示式運算的最終結果。(
如何解這道題目
既然知道了如何計算字首表示式,但是麻煩的是如何處理資料?
看了網上很多人的**,覺得寫的都不太簡練,這裡想到了一種比較簡潔的處理方式,使用c++的string和c語言的 atof()函式 。
**
#include #include #include #include #include #include using namespace std;
stack q;
int main()///讀到檔案結尾自動結束
n -= 1;///注意這裡n是個數,需要減一,可自己嘗試確認
for(int i = n-1; i>=0; i--)
double aa = q.top(); q.pop();
double bb = q.top(); q.pop();
if(a[i][0]== '+') q.push(aa+bb);
else if(a[i][0]== '-') q.push(aa-bb);
else if(a[i][0]== '*') q.push((aa*bb));
else if(a[i][0]== '/')
q.push(aa/bb);}}
else
}if(q.size() != 1) error = 1;
if(error) printf("error");
else printf("%.1f",q.top());
return 0;
}
PTA求字首表示式的值
算術表示式有字首表示法 中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2 3 7 4 8 4的字首表示式是 2 3 7 4 8 4。請設計程式計算字首表示式的結果值。輸入在一行內給出不超過30個字元的字首表示式,只包含 以及運算數,不同物件 運算數 運算符號 之間以空格...
利用棧求字首表示式的值
算術表示式有字首表示法 中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2 3 7 4 8 4的字首表示式是 2 3 7 4 8 4。請設計程式計算字首表示式的結果值。輸入格式說明 輸入在一行內給出不超過30個字元的字首表示式,只包含 以及運算數,不同物件 運算數 運算符...
pta7 21 求字首表示式的值
東軟學習小組成員 夜楓 題目 算術表示式有字首表示法 中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2 3 7 4 8 4的字首表示式是 2 3 7 4 8 4。請設計程式計算字首表示式的結果值。輸入格式 輸入在一行內給出不超過30個字元的字首表示式,只包含 以及運算數...