c# - 转换字符(又名 : '+' ) to an operator

标签 c# function rpn

我给自己设定了 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/

相关文章:

c# - 使用字符串从资源文件中读取值

c - 返回 double 的地址

JavaScript:我将如何仅反转字符串中的单词

java - 如何使用解析从字符串中分离 Int 和字符(java)

c# - 转换反向波兰表示法

c# - 为什么 WinForms 设计器中的控件会自行调整大小?

c# - 将 SQL CASE WHEN 语句转换为 C#

javascript - 在 Javascript 中调用不带括号 () 的函数

functional-programming - 如何在 Scheme 中仅使用 1 个列表来构建 2 个列表?

c# - 强制按值传递引用类型(或 .Clone()d on Pass)