字串的四則運算

2022-03-07 04:48:16 字數 2171 閱讀 4832

四則運算,最常用的當然是逆波蘭方法,現將表示式由中綴表示式轉化為字尾表示式,然後再使用棧計算即可。這兩步下來,估計沒有三四百行**是實現不了的。

中綴表示式轉字首字尾表示式

將中綴表示式轉換為字尾表示式的演算法思想:

數字時,加入字尾表示式;

運算子:

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

tag)

else

if ("

-" ==tag)

else

if ("

*" ==tag)

else

}int evalrpn(vector &tokens)

else

}return result=nums.top();

}

實際中遇到的筆試題是這樣的,有字串表示的乙個四則運算表示式,要求計算出該表示式的正確數值,比如:5+17*8-4/2。

題目中沒有括號,而且留白答題空超過半張紙,這裡只需要考慮四則運算的先後順序,是上述問題的特殊情況,程式實現運算規則即可。

思路: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 計算字串中的某已單...