.NET程序天下

web程序设计...

导航

四则运算(C#版)

  1/// <summary>
  2        /// 四则运算
  3        /// </summary>
  4        /// <returns>返回结果</returns>

  5        public int EvaluateExpression()
  6        {
  7            SeqStack<char> optr = new SeqStack<char>(20);    //存放操作符栈
  8            SeqStack<int> opnd = new SeqStack<int>(20);      //存放操作数栈
  9
 10            optr.Push('#');
 11            char c = (char)Console.Read();                   //读取每一个数
 12            bool isLoop = true;                              //定义一个循环变量
 13            char tmp = default(char);                        //临时操作符
 14            int a = 0;                                       //计算数1
 15            int b = 0;                                       //计算数2
 16            while (isLoop)
 17            {
 18                if (c == '#' && opnd.Top == 0)
 19                    isLoop = false;
 20                if (c != '+' && c != '-' && c != '*' && c != '/' && c != '(' && c != ')' && c != '#')//不是操作数入数据栈
 21                {
 22                    opnd.Push(((int)c)- 48);
 23                    c = (char)Console.Read();
 24                }

 25                else
 26                {
 27                    switch (Precede(optr.GetTop(), c))
 28                    {
 29                        case '<':
 30                            optr.Push(c);
 31                            c = (char)Console.Read();
 32                            break;
 33                        case '=':
 34                            optr.Pop();
 35                            c = (char)Console.Read();
 36                            break;
 37                        case '>':
 38                            tmp = optr.Pop();
 39                            a = opnd.Pop();
 40                            b = opnd.Pop();
 41                            opnd.Push(Operate(b, tmp, a));
 42                            break;
 43                        default:
 44                            throw new System.ExecutionEngineException("输入错误格式错误!");
 45                            break;
 46                    }

 47                }

 48            }

 49            return opnd.Pop();
 50        }

 51
 52        //判断优先级
 53        private char Precede(char optr1, char optr2)
 54        {
 55            //定义一个比较结果(用二维数组存下来)
 56            char[,] optrTable = 
 57'>''>''<''<''<''>''>' }
 58'>''>''<''<''<''>''>' }
 59'>''>''>''>''<''>''>' }
 60'>''>''>''>''<''>''>' }
 61'<''<''<''<''<''=''?' }
 62'>''>''>''>''?''>''>' }
 63'<''<''<''<''<''?''=' } }
;
 64
 65            int x = 0, y = 0;//申明存符号转化后的整数
 66
 67            //定义一个符号数组
 68            char[] optrs ='+''-''*''/''('')''#' }
 69            for (int i = 0; i < optrs.Length; ++i)
 70            {
 71                if (optr1 == optrs[i])
 72                    x = i;
 73                if (optr2 == optrs[i])
 74                    y = i;
 75            }

 76
 77            return optrTable[x, y];
 78        }

 79
 80        //计算两值,得出相应结果
 81        private int Operate(int a, char optr, int b)
 82        {
 83            int result = default(int);
 84            switch (optr)
 85            {
 86                case '+':
 87                    result = a + b;
 88                    break;
 89                case '-':
 90                    result = a - b;
 91                    break;
 92                case '*':
 93                    result = a * b;
 94                    break;
 95                case '/':
 96                    result = a / b;
 97                    break;
 98                default:
 99                    break;
100            }

101
102            return result;
103        }

以上代码仅贡参考,如有雷同,纯属巧合.
中间还可以根据自己的需求改进~~

posted on 2007-05-22 08:40  酷小涛  阅读(1772)  评论(0编辑  收藏  举报