能否举一个具体的C#代码示例来进行中缀表达式转后缀表达式?
时间: 2024-11-30 07:16:08 浏览: 15
当然可以。中缀表达式转换为后缀表达式也称为逆波兰表示法(Reverse Polish Notation, RPN),一个常见的C#代码实现会利用栈的数据结构来完成这个过程。这里是一个简单的例子:
```csharp
using System;
using System.Collections.Generic;
public class InfixToPostfix
{
private static readonly Dictionary<char, int> precedence = new Dictionary<char, int>
{
{'+', 1},
{'-', 1},
{'*', 2},
{'/', 2},
{'^', 3} // 如果有幂运算符,优先级更高
};
public static string Convert(string infix)
{
List<string> postfix = new List<string>();
Stack<char> operators = new Stack<char>();
foreach (char token in infix)
{
if (IsOperator(token))
{
while (!operators.isEmpty() && precedence[token] <= precedence[operators.Peek()])
postfix.Add(operators.Pop());
operators.Push(token);
}
else if (token != ' ')
postfix.Add(token.ToString()); // 对于数字或变量直接添加到后缀
}
while (!operators.isEmpty())
postfix.Add(operators.Pop());
return String.Join(" ", postfix); // 后缀表达式的结果以空格分隔
}
private static bool IsOperator(char c)
{
return precedence.ContainsKey(c);
}
public static void Main(string[] args)
{
Console.WriteLine(Convert("(A+B)*C-D")); // 输出:ABC * + D -
}
}
```
在这个例子中,我们遍历输入的中缀表达式,遇到操作符时,如果它的优先级大于等于栈顶操作符,则弹出栈顶直到找到一个优先级低的或者栈为空,然后将当前操作符压入栈;遇到数字或变量则直接添加到后缀列表。最后将栈中剩余的操作符依次压入后缀列表。
阅读全文