7-21 求前缀表达式的值 (25 分)(思路详解)
一:題目
算術(shù)表達(dá)式有前綴表示法、中綴表示法和后綴表示法等形式。前綴表達(dá)式指二元運算符位于兩個運算數(shù)之前,例如2+3*(7-4)+8/4的前綴表達(dá)式是:+ + 2 * 3 - 7 4 / 8 4。請設(shè)計程序計算前綴表達(dá)式的結(jié)果值。
輸入格式:
輸入在一行內(nèi)給出不超過30個字符的前綴表達(dá)式,只包含+、-、*、/以及運算數(shù),不同對象(運算數(shù)、運算符號)之間以空格分隔。
輸出格式:
輸出前綴表達(dá)式的運算結(jié)果,保留小數(shù)點后1位,或錯誤信息ERROR。
輸入樣例:
-
- 2 * 3 - 7 4 / 8 4
輸出樣例:
13.0
- 2 * 3 - 7 4 / 8 4
二:思路
舉例說明:
前綴表達(dá)式 逆向求解 中綴表達(dá)式
-+1*+2345
思路:
從右往左掃描先碰到+號,取+號后面兩個操作數(shù):2,3 得到:2+3.
繼續(xù)往左掃碰到*號,取2+3和 4 得到:(2+3)*4
繼續(xù)往左掃碰到+號,取1和(2+3)*4得到:1+(2+3)*4
繼續(xù)往左掃碰到-號,取1+(2+3)*4和5得到:1+(2+3)*4-5
在處理字符串的時候 用到了字符串的拼接 還有將字符串轉(zhuǎn)化成 float類型的
但這個題有點坑
我用的是棧 但在設(shè)置棧的時候 千萬記得將棧的類型設(shè)置成 float 類型 否則 測試點二和四過不去 。
三:上馬
/* 前綴表達(dá)式 逆向求解 中綴表達(dá)式 -+1*+2345思路:。從右往左掃描先碰到+號,取+號后面兩個操作數(shù):2,3 得到:2+3. 繼續(xù)往左掃碰到*號,取2+3和 4 得到:(2+3)*4 繼續(xù)往左掃碰到+號,取1和(2+3)*4得到:1+(2+3)*4 繼續(xù)往左掃碰到-號,取1+(2+3)*4和5得到:1+(2+3)*4-5 */ #include<bits/stdc++.h> using namespace std; int main() { vector<char>v;int flag = 0;stack<float>s; string str;getline(cin,str);//可以字符串當(dāng)中的空格讀進去 for(int i = str.size()-1; i >= 0; i--){char c = str[i];v.push_back(c);}// - + 1 * + 2 3 4 -5 // 5- 4 3 2 + * 1 + -for(int i = 0; i < v.size(); i++){string digital= " ";//實現(xiàn)字符串的拼接 // cout << "wyj"; if(v[i] == '+' || v[i] == '-' || v[i] == '/' || v[i] == '*'){double num1 = s.top();s.pop();double num2 = s.top();s.pop();double num;if( v[i] == '+' )num = num1 + num2;if( v[i] == '-' )num = num1 - num2;if( v[i] == '/' ){ num = num1 / num2;if(num2 == 0){flag = 1;break; }} if( v[i] == '*' )num = num1 * num2; s.push(num);i++;//下一個一定是空格 }else//不是運算符 就是 運算數(shù) { //21-while( i < v.size() && v[i] != ' '){digital = v[i] + digital;//實現(xiàn)字符串的拼接 解決小數(shù)點問題 解決多位數(shù)問題 i++;}float temp = atof(digital.c_str());s.push(temp);// cout <<temp ;} }float result = s.top();if( flag == 0)printf("%.1lf",result);elsecout << "ERROR" ;}
加油陌生人!
總結(jié)
以上是生活随笔為你收集整理的7-21 求前缀表达式的值 (25 分)(思路详解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 注册Dll文件
- 下一篇: java当中递归打印目录树