四則運算,最常用的當然是逆波蘭方法,現將表示式由中綴表示式轉化為字尾表示式,然後再使用棧計算即可。這兩步下來,估計沒有三四百行**是實現不了的。
中綴表示式轉字首字尾表示式
將中綴表示式轉換為字尾表示式的演算法思想:
數字時,加入字尾表示式;
運算子:
a. 若為 '(',入棧;
b. 若為 ')',則依次把棧中的的運算子加入字尾表示式中,直到出現'(',從棧中刪除'(' ;
c. 若為 除括號外的其他運算子, 當其優先順序高於除'('以外的棧頂運算子時,直接入棧。否則從棧頂開始,依次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,直到乙個比它優先順序低的或者遇到了乙個左括號為止。
高優先順序可以壓迫低優先順序!
人工實現轉換
這裡我給出乙個中綴表示式:a+b*c-(d+e)
第一步:按照運算子的優先順序對所有的運算單位加括號:式子變成了:((a+(b*c))-(d+e))
第二步:轉換字首與字尾表示式
字首:把運算符號移動到對應的括號前面 ,則變成了:-( +(a *(bc)) +(de)) ,把括號去掉:-+a*bc+de 字首式子出現。
字尾:把運算符號移動到對應的括號後面 ,則變成了:((a(bc)* )+ (de)+ )- ,把括號去掉:abc*+de+- 字尾式子出現。
比如:計算(2 + 1) * (13 + 5)
轉換後得:((2+1)*(13+5)) -> ((2 1) + (13 5) +) * -> 2 1 + 13 5 + *
這裡把字尾表示式儲存到vector中,實現棧的計算,如下:
int cal(int num1, int num2, string實際中遇到的筆試題是這樣的,有字串表示的乙個四則運算表示式,要求計算出該表示式的正確數值,比如:5+17*8-4/2。tag)
else
if ("
-" ==tag)
else
if ("
*" ==tag)
else
}int evalrpn(vector &tokens)
else
}return result=nums.top();
}
題目中沒有括號,而且留白答題空超過半張紙,這裡只需要考慮四則運算的先後順序,是上述問題的特殊情況,程式實現運算規則即可。
思路:1+5*6+6/2-5...
要構建1+5*6+....的式子,計算到第二個加號時要保留三個數:第一項1,第二項5,以及當前項6,還有兩個符號+*,然後比較符號的優先順序合併兩項,更新符號。最後再考慮1+5、1、以及沒有數字的情況。
/*這樣程式簡化了不少,百行**應該能搞定,雖然捲麵上裝下依然不太現實*侯凱,2014-9-16
*功能:四則運算 */
#include
#include
using
namespace
std;
int cal(int nnum1, char op, int
nnum2)
if('
-' ==op)
if('
*' ==op)
if('
/' ==op)
} int calculate(string
str)
else
else
if(stage == 1
)
else
if(stage == 2
)
else
}num = 0
; }
}float
result;
if(stage == 0
)
if(stage == 1
)
if((p=='
/'||p=='
*')&&(op=='
+'||op=='-'
))
else
return
result;
}int
main()
字串 四則運算
題目大意 有字串表示的乙個四則運算表示式,要求計算出該表示式的正確數值。四則運算即 加減乘除 另外該表示式中的數字只能是1位 數值範圍0 9 另若有不能整除的情況,按向下取整處理,eg 8 3得出值為2。若有字串 8 7 2 9 3 計算出其值為19。2012年華為上機的乙個題目 題目思路 建立棧分...
字串的四則運算
public string addstrings string num1,string num2 if b 0 tmp 10 return sb.reverse tostring 題目二 字串相減 給定兩個字串形式的非負整數 num1 和num2 計算它們的差。預設num1比num2大 注 不能使用...
as 字串解析成四則運算
1,解析字串 a 1 b 2 c 1 2等類似字串表示式 2.步驟一是先取出 中的標記id,根據id取到對應的數值,第一步解析後狀態似 4 5 1 2 3.步驟二是根據 4 5 1 2解析成四則元算後,得到乙個結果值,return string型別。package com.zzz 計算字串中的某已單...