time limit: 3 second
memory limit: 2 mb
問題描述
從鍵盤上輸入算術表示式串(只含+、-、*、/運算子,允許含圓括號,運算數為整型、實型常量),輸出算術表示式的值。設輸入的表示式串是合法的。
輸入為一行算術表示式串
輸出一行,算術表示式的值(輸出兩位小數,整數部分按實際位數輸出,最後用換行結束)。
(3+2)-5*(6-1)
-20.00
【題解】
用分治法來求中綴表示式:
具體過程.每層遞迴,都找到所有運算子裡面優先級別最低的運算子。
假設這個運算子的位置為k
則把1..k-1截出來 設為x,k+1..length(s)也截出來,設為y;
然後對x和y進行相同的操作。也去找運算級別最小的運算子。。。
直到最後操作的乙個字串全是數字。然後就返回這個數字就好。
最後根據k位置的運算子。做相應的運算。
即"x" 運算子 "y";
【**】
#include #include #include #include using namespace std;
string s;
char cmp(char x, char y) //判斷操作符x和操作符y,哪乙個優先順序大
int find(string tt) //表示找tt這個字串的優先順序最小的操作符
i++;
}while (b !=0);
}else
if (tt[i] == '*' || tt[i] == '/' || tt[i] == '+' || ( tt[i] == '-' && i >0 && (tt[i-1] ==')' || (tt[i-1] >='0' && tt[i-1] <='9'))))
i++;
}else
i++; //不管是什麼 都要遞增迴圈變數
} return k;
}void reducebracket(string & tss) //去掉兩邊的括號 表示對括號裡的string進行操作
if (b!=0)
return;
tss = tss.erase(ltss-1,1); //去除兩邊的括號
tss = tss.erase(0,1);
}double reduce( string ss)
else //如果是減法的話,要判斷它前一位是不是右括號或者是數字。因為可能是負數
if (ss[i] == '-' && i > 0 && (ss[i-1] == ')' || (ss[i-1] >='0' && ss[i-1] <='9')))
i++;
} if (!judge) //如果沒有運算子。則這個串就是乙個數字。直接返回就可以了
reducebracket(ss); //如果有運算子。就先去掉兩邊的括號(如果有)
int k = find(ss); //找到運算級別最小的運算子的位置
string s1 = ss.substr(0,k); //擷取這個運算子左邊的"數字"
string s2 = ss.substr(k+1,ss.size()-s1.size()-1); //擷取這個運算子右邊的"數字"
double x = reduce(s1),y = reduce(s2),z; //對左邊和右邊的進行計算。
switch (ss[k]) //對ss[k]進行判斷 根據運算子做相應的運算。
return z; //返回這個值。
}int main()
模擬計算機處理算術表示式過程
從鍵盤上輸入算術表示式串 只含 運算子,允許含括號 輸出算術表示式的值。設輸入的表示式串是合法的。演算法分析 建立兩個棧,乙個是運算元棧 number 乙個是運算子棧 symbol 根據運算子的優先順序對兩個棧進行相應的操作。如下 include include include includeusi...
python處理算術表示式
假設有這樣的要求 輸入乙個形如 12 6.3 3 2 4 7 的字串,求出其運算結果 對於這種問題有兩種辦法 1 使用python自帶的庫函式eval,如下所示 2 第二種方法當然是自己寫乙個函式去處理了 處理這個問題的基本思路是 第一步 定義兩個變長陣列a b,a用來存放輸入字串中的數字,b用來存...
計算機的改良 模擬
description 最近實驗室收到了乙個任務 解一元一次方程。為了很好的完成這個任務,zl先生首先研究了一些一元一次方程的例項 4 3x 8 6a 5 1 2 2a 5 12y 0 zl先生被主管告之,在計算器上鍵入的乙個一元一次方程中,只包含整數 小寫字母及 這三個數學符號 當然,符號 既可作...