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