題目如下:
算術表示式有字首表示法、中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2+3*(7-4)+8/4
的字首表示式是:+ + 2 * 3 - 7 4 / 8 4
。請設計程式計算字首表示式的結果值。
輸入在一行內給出不超過30個字元的字首表示式,只包含+
、-
、*
、/
以及運算數,不同物件(運算數、運算符號)之間以空格分隔。
輸出字首表示式的運算結果,保留小數點後1位,或錯誤資訊error
。
+ + 2 * 3 - 7 4 / 8 4
13.0
一開始思路比較直白,由右往左,一直遍歷到開頭,首先想到要設計乙個字串轉化為數字的函式,設計了半天,沒及時測試,結果卡了好久,大方向也有點問題,一開始用了兩個棧;現在糾正過來了atof()函式即可自動轉化,用函式遞迴,即可不需要用到棧了一下是本人自己設計的,略顯簡陋,不建議閱讀:
#if 1
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const int n=10005;
char s0[n],s[n],n;
stacks;
//計算前提(遞推關係)
//1.!s1.empty()&&s2.size()>=2
'/')float f=s2.top;s2.pop();s2.top()!=0;s2.push(f);
float cal(char c)
}//判斷正負號僅需問一下是否是長度為大於1,第乙個字元為『+』或『-』 即可
//判斷是否有小數點,然後前取值後取值
bool getnum(char *ptr,char &c,float &f,int l)
term=0.1;
for(int i=t;i='0')
else }
int main()
else
if(isok)
}else
isok=false;
} }if(!isok||s.size()!=1)
printf("error\n");
else
printf("%.1f\n",s.top());
return 0;
}#endif
/*情況1:一位數四種運算
+ + 2 * 3 - 7 4 / 8 4
輸出1:
13.0
情況2:有負數,兩位整數
/ -25 + * - 2 3 4 / 8 4
輸出2:
12.5
情況3:異常退出:1.不匹配 2.被除數為0
/ 5 + * - 2 3 4 / 8 2
輸出3:
error
情況4:有正數符號
+12.23
輸出4:
12.2
*/
至於優化後的**,簡明,清晰,直白,參考 求字首表示式的值
首先粘一下題目 算術表示式有字首表示法 中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如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個字元的字首表示式,只包含 以及運算數,不同物件 運算數 運算符號 之間以空格...
求字首表示式的值
目錄 求字首表示式的值 問題描述 實現 算術表示式有字首表示法 中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2 3 7 4 8 4的字首表示式是 2 3 7 4 8 4。請設計程式計算字首表示式的結果值。輸入格式 輸入在一行內給出不超過30個字元的字首表示式,只包含 ...