[C#]利用疊堆的原理計算加減乘除(類似工程用計算機)

摘要:[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)");
        }

 


聰明人會抓住每一次機會,更聰明的人會不斷創造新機會。
每一秒都有千萬種可能,包括奇蹟!

技術永遠不是問題!

座右銘:有電腦的地方,就找得到我!!