【中缀表达式】
类似这样 ((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~~~