演算法(3)簡單四則運算

2021-09-17 03:42:10 字數 2917 閱讀 6461

實現10以內四則運算(只包含數字,±*/和小括號)

四則運算使用「字尾表示式」演算法來計算,字尾表示式可以無需考慮運算子優先順序,直接從左至右依次計算。

問題分解成2部分,一是將「中綴表示式」(我們正常寫的四則運算字串樣式,即我們的輸入表示式)轉為「字尾表示式」;二是使用「字尾表示式」求值。

「中綴表示式」轉「字尾表示式」流程:

若是「)」,重複彈出棧頂運算子,進入結果佇列,直到遇到「(」,將其丟棄。

遍歷完成後,即生成了「字尾表示式」,求值過程如下:

/**

* 把character轉換成doublec

* @param c - 需要轉換的字元

* @return 返回c對應的數字

*/func _c2n(_ c: character) throws -> double

let zero = "0".unicodescalars.first!.value;

return double(c.unicodescalars.first!.value - zero);

}/**

* 最小單元計算

* @param n1 - 數字1

* @param n2 - 數字2

* @param mark - 符號

* @return 返回 的結果

*/func _eval(_ n1: double, _ n2: double, _ mark: character) throws -> double

return n1 / n2;

default:

throw algorithmerror.msg("符號錯誤");

}}/**

* 比較符號

* @param a - 符號a

* @param b - 符號b

* @return 如果a的優先順序<=b的優先順序返回true,否則返回false

*/func _arithmeticcompare(_ a: character, _ b: character) throws -> bool

}/**

* 計算10以內的四則運算

* @param str - 輸入中綴表示式

* @return - 返回計算結果

*/func arithmetic(_ str: string) throws -> double

//直接進符號

markstack.push(c);

break

case ")":

//依次出棧直到括號結束

while markstack.top() != "(" && markstack.count() > 0

}if markstack.count() > 0 else

break

case "+", "-", "*", "/":

//比c優先順序高的都進結果棧

if let t = markstack.top()

}else}}

markstack.push(c);

break;

case "0"..."9":

if let lc = lastc , case "0"..."9" = lc

//直接進結果

retstack.push(c);

break;

default:

throw algorithmerror.msg("發現錯誤");

}lastc = c;

}//符號棧可能不空

while markstack.count() > 0

//計算結果

let numstack = stack();

while retstack.count() > 0 else

}else}}

}if numstack.count() != 1

return numstack.pop()!;

}

function

size

(inputarr)

let comparedict =

letcompare

=(a, b)

=>b=$

`;}return comparedict[a]

< comparedict[b];}

//中綴轉字尾

//數字直接入棧2,符號如果優先順序低於棧頂,依次出棧1,入棧2.

for(

const e of inputarr)

else`;

}if(e ==

'(')

else

if(e ==

')')

else}if

(!valid)

}else

else

}//所有符號都出棧了或者遇到了'('if(

!handled)}}

}while

(stack1.length >0)

if(stack1.length !=0)

while

(stack2.length >0)

else

let v =

eval(`

$$$`

);stack1.

push

(v);}}

console.

log(

`stack1=$`

);return stack1.

pop();

}

上述2個過程複雜度都比較低,如果遇到數字都是直接儲存,遇到符號會進行一次比較或計算,時間複雜度為o(n)。

上述演算法中使用了3個棧或佇列,其中2個棧能夠重複使用,空間複雜度為o(2n)。

上面的演算法只是關注演算法本身邏輯,健壯性及通用性比較差,如果用於正式的程式,還需要增加很多驗證邏輯及更多運算子的支援。

簡單四則運算

form1 如下 using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using syst...

簡單四則運算

實現乙個簡單的四則混合運算。並且在計算100範圍以內。我實現的是兩位數之間的加減乘除混合運算,首先先定義幾個量。然後思考一下你所想要的計算方式,我在這裡就簡單的進行了數字的加減乘除,進行分為各種情況,這裡僅僅把四組的數字的混合運算一下,然後新增監聽並達到的要求。我的這個四則運算存在很多的不足,例如乘...

四則運算3

一.要求 1.讓程式能接受使用者輸入答案,並判定對錯。最後給出總共對 錯 的數量。二.思路 定義變數c1,c2並初始化,每齣一道題就答一道題,如果正確c1 如果錯誤c2 再輸出c1和c2的值 三.include using namespace std include include int c1 0...