我给自己设定了 RPN 计算器的挑战。我有一个包含使用的数字的列表(按顺序)和另一个包含使用的运算符的列表(按顺序,作为字符)。我怎样才能创建一个函数,从list1中获取[0],从list2中获取[0],然后从list1中获取[1],然后从list2中获取[1]...但是当从list2中获取值作为字符时,将其转换为可用于计算的实际运算符? - 谢谢
static int cal()
{
string[] store = input.Split(' ');
List<int> num = new List<int>();
List<char> op = new List<char>();
foreach (string i in store)
{
if (Convert.ToInt32(i) / Convert.ToInt32(i) == 1)
{
num.Add(Convert.ToInt32(i));
}
else
{
op.Add(Convert.ToChar(i));
}
}
}
最佳答案
首先,这种计算器可能适合 Stack 作为数据存储。
var theStack = new Stack<decimal>();
然后,如果您想从简单开始,请创建一个委托(delegate)来表示二进制操作(例如,对堆栈上前 2 个数字进行操作)
delegate decimal BinaryOperation(decimal a, decimal b);
您可以创建方法来实现此目的;
public decimal AddFn(decimal a, decimal b)
{
return a+b;
}
然后创建一个字典来映射运算符名称和运算符函数;
var map = new Dictionary<string, BinaryOperation>();
map.Add("+", AddFn);
最后,运行程序时使用 map ;
foreach(var i in store)
{
decimal number;
BinaryOperation op;
if (decimal.TryParse(i, out number))
{
// we've found a number
theStack.Push(number);
}
else if (map.TryGetValue(i, out op))
{
// we've found a known operator;
var a = theStack.Pop();
var b = theStack.Pop();
var result = op(a,b);
theStack.Push(result);
}
else
{
throw new Exception("syntax error");
}
}
因此,您可以使用 map
变量注册更多运算符,而无需更改压入、弹出以及对堆栈上的值进行操作的核心逻辑。
关于c# - 转换字符(又名 : '+' ) to an operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34040854/