语文不好,不太会组织语言,希望不要太在意。
如题,先简要介绍一下什么是逆波兰式 通常我们在写数学公式的时候 就是a+b+c这样,这种表达式称为中缀表达式,逆波兰式又称为后缀表达式,例如a+b 后缀表达式就为ab+
而把中缀表达式转为逆波兰式也是很容易的,以下算法摘自百度百科
简要说一下栈,栈是一种先进后出的对象集合,可以把栈理解为一个桶,先进后出 Stack Peek()是取出但是不剔除 做比较的时候用,Pop()是出栈,Push()入栈
     static bool IsNumber(string s)
        {
            return Regex.IsMatch(s, @"\d+");
        }
判断元素是否为运算符(+-*/)
static bool IsSiZe(string s) { string ts = "+-*/"; return ts.IndexOf(s) > -1; }
判断优先级
static int Level(string s) { int i = 0; switch (s) { case ",": i = 0; break; case "(": case ")": case "#": i = 1; break; case "+": case "-": i = 2; break; case "*": case "/": i = 3; break; } return i; }
计算
private static void Calc(Stack<string> numStack, Stack<string> operStack) { int rightnum = int.Parse(numStack.Pop()); int leftnum = int.Parse(numStack.Pop()); string oper = operStack.Pop(); switch (oper) { case "+": numStack.Push((leftnum + rightnum).ToString()); break; case "-": numStack.Push((leftnum - rightnum).ToString()); break; case "*": numStack.Push((leftnum * rightnum).ToString()); break; case "/": numStack.Push((leftnum / rightnum).ToString()); break; } }
总体实现代码
   static void ToNiBoLan(string exp)
        {
            operStack.Push("#");  //进栈  便于比较
          
            string token = ""; 
            for (int i = 0; i < exp.Length; i++)
            {
                if (IsNumber(exp[i].ToString()))  //如果是数字
                {
                    token += exp[i].ToString();
                }
                else if (exp[i].ToString() == "(")   //左括号直接进栈
                {
                    operStack.Push(exp[i].ToString());   
                    if (IsNumber(token))  
                        numStack.Push(token);
                    token = "";
                }
                else if (IsSiZe(exp[i].ToString()))
                {
                    if (IsNumber(token))
                        numStack.Push(token);
                    token = "";
                    int item = Level(exp[i].ToString()).CompareTo(Level(operStack.Peek()));  //比较运算符优先级
                    if (item > 0)  //如果优先级高于栈顶,运算符进栈
                    {
                        operStack.Push(exp[i].ToString());
                    }
                    else   //如果运算符小于或等于栈顶  进行计算 并将运算符进栈
                    {
                        Calc(numStack, operStack);
                        
                        operStack.Push(exp[i].ToString());
                    }
                }
                else if (exp[i].ToString() == ")")  //如果遇到右括号 依次遍历进行计算直至遇到左括号
                {
                    if (IsNumber(token))
                        numStack.Push(token);
                    token = "";
                    while (operStack.Peek() != "(")
                    {
                        Calc(numStack, operStack);
                    }
                    token = numStack.Pop();  //拿出数字便于进行下一次计算
                    operStack.Pop();  //符合条件的左括号出栈
                 
                }
                else  //遍历结束
                {
                    if (IsNumber(token))
                        numStack.Push(token);
                    token = "";
                    while (numStack.Count > 1)
                    {
                        Calc(numStack, operStack);
                    }
                }
            }
        }
调用
string s = Console.ReadLine()+"#"; //为了便于比较,在表达式结尾加上"#" ToNiBoLan(s); Console.WriteLine(numStack.Pop());
总体代码如此
原文:http://www.cnblogs.com/ZyCoder/p/6696464.html