摘要:[C#]利用疊堆的原理計算加減乘除
自己寫的,結果是正確的,但是有三個部份並沒有考量
1.無驗証運算式的正確性
2.不可帶負號的數值
3.陣列宣告過大
麻煩有興趣的高手可以改寫…
//疊堆計算 public decimal Compute(string sEquation) { char[] Operand = new char[] { '+', '-', '*', '/' }; //定義運算元(由小到大) sEquation = "(" + sEquation.Replace(" ", "") + ")"; //除掉所有空白,並加上左右空白,偷懶寫法,目的可以跑最後一次的計算 char c = ' '; char[] arrOperand = new char[sEquation.Length]; //運算元容器 decimal[] arrOperator = new decimal[sEquation.Length]; //運算子容器 string sOperator = ""; int iOperand = 0, iOperator = 0; //定義Top for (int i = 0; i < sEquation.Length; i++) { c = sEquation[i]; if (c.Equals('(') || c.Equals(')') || Array.IndexOf(Operand, c) >= 0) { if (sOperator.Length > 0) //判斷是否有大於零的字串 { arrOperator[iOperator] = Convert.ToDecimal(sOperator); //數值轉換成存入容器 iOperator++; //運算子容器Top+1 } if ((c.Equals('(')) || iOperand == 0) //左括號無條件進去或是第一個運算元 { arrOperand[iOperand] = c; iOperand++; //運算元容器Top+1 } else { iOperator--; //運算元容器Top-1 if (c.Equals(')')) //為右括號時將運算元逐一彈出運算 { iOperand--; while (!arrOperand[iOperand].Equals('(')) //一直找到左括號就結束 { arrOperator[iOperator - 1] = Cal(arrOperator[iOperator - 1], arrOperator[iOperator], arrOperand[iOperand]); iOperator--; iOperand--; } } else { arrOperand[iOperand] = c; //先將運算元存入 do { //只要iOperand = 0 或是前一個小於等於現在這個運算元就出去 if (iOperand == 0 || Array.IndexOf(Operand, arrOperand[iOperand]) > Array.IndexOf(Operand, arrOperand[iOperand - 1])) { iOperand++; break; } else { arrOperator[iOperator - 1] = Cal(arrOperator[iOperator - 1], arrOperator[iOperator], arrOperand[iOperand - 1]); iOperator--; iOperand--; arrOperand[iOperand] = c; //把原本的運算元存到遞減後的運算元容器 } } while (true); } iOperator++; //運算元容器Top+1 } sOperator = ""; } else { sOperator += c; } } return arrOperator[0]; } //判斷 public decimal Cal(decimal x, decimal y, char c) { decimal z = 0; switch (c) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x * y; break; case '/': z = x / y; break; } return z; } //使用 public void Test() { decimal i = Compute("1+2*(3-4)"); }
聰明人會抓住每一次機會,更聰明的人會不斷創造新機會。
每一秒都有千萬種可能,包括奇蹟!
技術永遠不是問題!
座右銘:有電腦的地方,就找得到我!!