[英]Converting a char (aka: '+') to an operator
我給自己設定了RPN計算器的挑戰。 我有一個使用數字的列表(按順序)和另一個使用運算符的列表(按字符)。 如何創建一個函數,該函數將從list1取[0],從list2取[0],然后從list1取[1],然后從list2取[1] ...但是當從list2取一個值作為char時,將其轉換為可以在計算中使用的實際運算符? - 謝謝
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 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);
最后,在運行程序時使用地圖;
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
變量中注冊更多運算符,而無需更改推入,彈出和對堆棧值進行操作的核心邏輯。
您的方法永遠無法工作,因為RPN計算器依賴於基於堆棧的處理。 如果您正確實現該部分,其余部分將自行解決。 一個簡單的RPN計算器的偽代碼為:
foreach(item in expression)
{
if(isNumber(item))
stack.push(item.toNumber());
else if(item == '+')
stack.push(stack.pop() + stack.pop());
else if(item == '-')
stack.push(stack.pop() - stack.pop());
else
throw Exception("Unknown operator: " + item);
}
if(stack.size != 1)
throw Exception("Expression was invalid");
print("Result is " + stack.pop());
如果以這種方式實現它,而不是2個單獨的列表,其余的將隨之出現。
我猜,您的方法很冷,如下所示:
static int cal()
{
string[] store = input.Split(' ');
var res = 0;
int value;
var mapOp = new Dictionary<string, Func<List<int>, int>>();
mapOp.Add("+", l => l.Aggregate(0, (x, y) => x + y));
mapOp.Add("-", l => l.Skip(1).Aggregate(l[0], (x, y) => x - y));
var process = new Action<string,List<int>>((o, l) =>
{
var operation = mapOp[o];
var result = operation(l);
l.Clear();
l.Add(result);
});
var numbers = new List<int>();
foreach (var i in store)
{
if (int.TryParse(i, out value))
numbers.Add(value);
else
process(i, numbers);
}
return numbers.First();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.