摘要:[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)");
}
聰明人會抓住每一次機會,更聰明的人會不斷創造新機會。
每一秒都有千萬種可能,包括奇蹟!
技術永遠不是問題!
座右銘:有電腦的地方,就找得到我!!