4. 中置表示法(infix notation) 轉後置表示法(postfix notation)
想不出來的話就直接幹AST
// (6+2)*5-8/4
int lvl(string s)
{
if(s=="(")return -100;
return s == "+" || s == "-" ? 0 : 1;
}
while (true)
{
var k = Console.ReadLine();
List<string> segs = new List<string>();
foreach (var item in k)
{
if (item == ' ') continue;
if (Char.IsDigit(item))
{
if (segs.Count == 0 || !Char.IsDigit(segs.Last()[0]))
{
segs.Add("");
}
segs[segs.Count - 1] = segs.Last() + item;
continue;
}
segs.Add(item + "");
}
List<string> o = [];
Stack<string> ops = [];
foreach (var item in segs)
{
if (char.IsDigit(item[0]))
{
o.Add(item);
continue;
}
if (item == "(")
{
ops.Push(item);
continue;
}
if (item == ")")
{
while (ops.Peek() != "(")
{
o.Add(ops.Pop());
}
ops.Pop();
continue;
}
while (ops.Count != 0 && lvl(ops.Peek()) >= lvl(item))
{
o.Add(ops.Pop());
}
ops.Push(item);
}
o.AddRange(ops);
Console.WriteLine(string.Join(" ", o));
}AST
Last updated