【中缀表达式】
类似这样 ((3+4)5)才是一个完整的中缀表达式,就是说括号表示优先级,给计算机计算的时候先计算括号内的,同时括号内也可以嵌套,因此括号里的括号中的运算优先级更高
【后缀表达式】
如果是(3+4)5这样的形式,首先先加上外括号
表达式分为运算符和运算数,运算数即3、4、5,运算符就是()、+、-/(减除要注意左右操作数)
并且运算时运算符只招相邻的两个运算数
【中缀转后缀表达式】 结果:34+5
第一步((3+4)5)—>(34+5)
第二步(34+5)此时34+是的左操作数,5是的右操作树—>34+5
图解:

【中缀转前缀表达式】 结果:*+345
同样核心是运算符替换左操作符左侧操作数的左括号,右括号对应删掉
【运算核心】
①操作符移至(左-前缀/右-后缀)括号处
②相对括号删除
【中缀转后缀规律】
1)操作数的顺序没有变—————还是先算3,4后5
2)操作符出现的顺序也和运算次序一致(中缀转前缀相反)
3)操作符比操作树晚输出
【编程流程】
首先遇到数字则先输出,遇到操作符要暂存—>依据优先级规则,这将导致要反转次序输出—>栈保存暂未处理的操作符
【完整流程—网上的】

最后参照北大python教数据结构老师的程序写了一波,太难了搞了一整天
C#版
但是这版缺陷很大
必须是正确的中缀表达式比如(3+4)5必须改为((3+4)5)
这是控制台程序
static void Main(string[] args){//添加优先级Dictionary<string, int> Operator = new Dictionary<string, int>();Operator.Add("(", 1);Operator.Add("*", 3);Operator.Add("/", 3);Operator.Add("+", 2);Operator.Add("-", 2);List<string> tokenlist = new List<string>();List<string> final = new List<string>();Stack<string> operators = new Stack<string>();Console.WriteLine("请输入中缀表达式:");string a = Console.ReadLine().Trim();for(int i=0;i<a.Length;i++){tokenlist.Add(a.Substring(i, 1));//把每个字符单独置入tokenlist}char temp;string topstack;//栈顶的字符foreach(string token in tokenlist){temp = Convert.ToChar(token);if(Char.IsNumber(temp)||Char.IsLetter(temp)){final.Add(token);}else if(token=="("){operators.Push(token);}else if(token==")"){topstack = operators.Pop();final.Add(topstack);while(topstack!="("){topstack = operators.Pop();}}else{while(operators.Count!=0 && (Operator[operators.Peek()]>=Operator[token])){tokenlist.Add(operators.Pop());final.Add(operators.Pop());}operators.Push(token);}}foreach(string s in final){Console.Write(s);}Console.ReadKey();}
这样一看确实python挺简便蛤
结果:
Over~~~
