實現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...