用C#写算术表达式求值,通过实验掌握栈的基本操作和中缀表达式求值原理与方法
时间: 2024-10-24 12:04:55 浏览: 33
在C#中,利用栈(Stack)数据结构来实现中缀表达式(Infix Notation)求值,通常涉及以下几个步骤:将中缀表达式转换为后缀表达式(RPN,Reverse Polish Notation),然后依次执行后缀表达式中的操作。
1. **中缀转后缀(逆波兰式)**:
- 遇到操作数,直接压入栈中。
- 遇到左括号,入栈。
- 遇到右括号,弹出栈顶的操作数直到遇到左括号,然后将这个括号对作为一个整体压回栈。
- 遇到操作符,比较其优先级,如果栈顶元素的优先级小于当前操作符,则将其压入栈;否则继续遍历。
2. **后缀求值**:
- 遇到操作数,直接输出。
- 遇到操作符,从栈顶取出两个操作数,执行相应的运算,并把结果压回栈。
下面是一个简单的C#代码实现:
```csharp
using System;
using System.Collections.Generic;
class RpnCalculator
{
Stack<int> operatorStack = new Stack<int>();
List<int> operandStack = new List<int>();
int Calculate(string infixExp)
{
foreach (char c in infixExp)
{
if (char.IsDigit(c))
operandStack.Add(c - '0'); // 转换为数字并入栈
else if (c == '(')
operatorStack.Push(c);
else if (c == ')')
{
while (operatorStack.Peek() != '(')
ApplyOperator();
operatorStack.Pop(); // 弹出左括号
} else // 操作符
{
while (!operatorStack.IsNullOrEmpty() && HasHigherPrecedence(c, operatorStack.Peek()))
ApplyOperator();
operatorStack.Push(c - '0'); // 先入栈操作符
}
}
while (!operatorStack.IsNullOrEmpty())
ApplyOperator(); // 处理剩余的操作符
return operandStack[0];
}
bool HasHigherPrecedence(char op1, char op2)
{
// 根据实际需求定义优先级规则
return op1 == '+' || op1 == '-' ? op2 == '*' : op2 == '+' || op2 == '-';
}
void ApplyOperator()
{
int b = operandStack.Pop();
int a = operandStack.Pop();
switch (operatorStack.Pop())
{
case '+':
operandStack.Push(a + b);
break;
case '-':
operandStack.Push(a - b);
break;
// 添加更多操作符的支持...
}
}
}
// 使用示例
string infixExp = "4 + 5 * (6 / 2)";
int result = new RpnCalculator().Calculate(infixExp);
Console.WriteLine($"Result of {infixExp} is {result}");
```
阅读全文