C# 数学表达式生成最好不使用堆栈或队列

C# 数学表达式生成最好不使用堆栈或队列,c#,java,expression,C#,Java,Expression,给定允许的+、/、-、*,以及用户输入的单个数字列表(允许任何长度),我如何输出所有可能的数学表达式组合(以及结果值),这些组合可以由数字和给定的常量运算符集组成?例如,我还希望考虑可伸缩性,以便能够轻松地在混合中添加另一个操作符(如果可能) 解决方案最好不使用堆栈或队列,但它们不是不可接受的 例如,如果输入为: {1,3,5,7} 那么可能的输出将是 (1+3)-(5+7) = -8 (1+5)-(3-7) = 10 etc... (13+57)是不是可能的组合,因为不允许数字组合 另

给定允许的+、/、-、*,以及用户输入的单个数字列表(允许任何长度),我如何输出所有可能的数学表达式组合(以及结果值),这些组合可以由数字和给定的常量运算符集组成?例如,我还希望考虑可伸缩性,以便能够轻松地在混合中添加另一个操作符(如果可能)

解决方案最好不使用堆栈或队列,但它们不是不可接受的

例如,如果输入为:

{1,3,5,7}
那么可能的输出将是

(1+3)-(5+7) = -8
(1+5)-(3-7) = 10
etc...  
(13+57)是不是可能的组合,因为不允许数字组合

另外请注意:我可以使用Scheme编写类似的东西来实现这一点,但我似乎不能用Java或C来实现。

我不是Java或C程序员,所以这里有一个语言无知的答案。您选择的两种语言似乎都没有eval函数。我建议你们采用反向波兰符号。将输入捕获为字符串中的字符或任何您想要的内容;也将运算符编码为字符。然后,使用迭代器或其他方法,生成输入数字的所有可能顺序,然后生成正确数量的二进制运算符的所有可能顺序。然后使用几个左右的switch语句将每个字符串转换为结果


对不起,我不能说得更清楚了,我得赶时间了。

经典排列问题

诀窍是传入一组函数指针以创建运算符数组(堆栈、列表等)。在C#和Java中,函数指针可以通过对象和接口实现

然后,您需要列出每个列表的所有不同顺序

还要注意的是,您只能有3个运算符,并且有些运算符是否可以以不同的方式应用于任意一侧的集合是不明确的

乙二醇//

a+b/c-d(a+b)/(c-d)
我不确定是否也要考虑括号。如果是的话,解决方案就有点棘手(尽管原则是一样的)。简单地包括一组括号,并渗透那些(虽然你也必须考虑约束,左括号必须有一个右括号)。我这里不谈这个

对于输入,排列算法比比皆是,所以只需选择一个并使用它来生成各种运算符和数字集合

要计算所有结果,只需迭代操作符列表,按顺序传递数字列表,就完成了

乙二醇//

公共接口操作符{
公共双计算(整数1,整数2);
}
公共类Add实现操作符{
公共双计算(整数1,整数2){
返回双精度(val1+val2);
} 
}
公共类子运算符{
公共双计算(整数1,整数2){
返回双(val1-val2);
} 
}
公共类Mul实现运算符{
公共双计算(整数1,整数2){
返回双精度(val1*val2);
} 
}
公共类Div实现运算符{
公共双计算(整数1,整数2){
返回双(val1/val2);
} 
}
公共静态双计算(运算符[]运算符列表,int[]值列表)
{
Double ret_val=Double(值列表[0]);
对于(int j=0;j

等等。

为什么我们要投票结束?好奇的是,你是想过滤掉一些可能的组合,还是想生成所有可能的组合?我仍然认为这是一个合理的问题,尽管它因为某种原因被投票关闭。令人惊讶@Kiamaluno,检索所有组合Fail,看看这不是一个真正的问题。希望我有足够的代表投票重新开放。为什么要限制堆栈或队列?原则是一样的(来自友好的邻居)。这是否考虑到这样的情况:例如:(7/5)+(6/1),但它可能是7/(5+(6/1))这基本上取决于运营商名单的内容和“插槽”的数量。如果允许重复,排列算法将更改为生成包含重复项的列表。如果您允许使用括号,那么您需要渗透所有允许使用括号的地方,然后通过calc引擎运行它们。然后你必须确保它们是平衡的。一旦你进入了游戏,你就真正进入了堆栈、树和递归。如果您已经在Scheme中完成了,那么函数指针应该是将代码移植到Java/C#所需的全部。我只是想知道是否有一种方法可以在没有RPN和Java/C的情况下完成这项任务。
a+b / c - d <> (a+b) / (c-d)
public interface Operator {
    public Double calc(int val1, int val2);
}

public class Add implements Operator {
    public Double calc(int val1, int val2){
        return Double(val1 + val2);
    } 
}

public class Sub implements Operator {
    public Double calc(int val1, int val2){
        return Double(val1 - val2);
    } 
}
public class Mul implements Operator {
    public Double calc(int val1, int val2){
        return Double(val1 * val2);
    } 
}

public class Div implements Operator {
    public Double calc(int val1, int val2){
        return Double(val1 / val2);
    } 
}

public static Double calc(Operator[] operator_list, int[] value_list)
{
  Double ret_val = Double(value_list[0]);

  for (int j = 0; j < operator_list.length(); j++){
    Operator oper = operator_list[j];
    ret_val = oper.calc(ret_val, value_list[j+1]);                 
  }

  return ret_val;
}

public static void main(String[] args)
{ 
int[] values = {1,2,3,4};

Operator add = new Add();
Operator div = new Div();
Operator mul = new Mul();
Operator sub = new Sub();

Operator[] operators = {add, div, sub, mul};

// Calculate from permutation algorithm...
// Don't forget to only generate three values for each permutation!
// out_perm_1 = {add, div, sub};
// out_perm_2 = {div, add, sub};
Operator[] operator_permutations = perm(operators);

// Calculate from permutation algorithm...    
// val_perm_1 = {1,2,3,4};
// val_perm_2 = {2,1,3,4};
int[] value_permutations = perm(values);

// Interleave the two lists...
for (int i=0; i < output_permutations.length(); i++)
{
    for (int j=0; j < value_permutations.length(); j ++)
    {
        System.out.println(calc(output_permutations[i], output_permutations[j]));
    }
}
}