数学表达式生成优选地不使用堆栈或队列

时间:2009-12-21 12:44:27

标签: c# java expression

给定允许的+,/, - ,*运算符,并给出用户输入的单位数字列表(允许任意长度),如何输出所有可能的数学表达式组合(和结果值)可以用数字和给定的常数运算符组成吗?例如,我还希望允许可伸缩性,这样我就可以轻松地在混合中添加另一个运算符(如果可能的话)。

优选地,解决方案不会使用堆栈或队列,但它们不是不可接受的。

例如,如果输入为:

{1,3,5,7}

那么可能的输出将是

(1+3)-(5+7) = -8
(1+5)-(3-7) = 10
etc...  

(13 + 57)可能的组合,因为不应该允许组合数字。

另请注意:我能够使用Scheme编写类似的东西来执行此操作,但我似乎无法使用Java或C#。

2 个答案:

答案 0 :(得分:4)

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

抱歉,我不能更明确,不得不赶时间。

答案 1 :(得分:0)

经典排列问题。

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

然后,您需要提出每个列表的所有各种排序。

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

例如//

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]));
    }
}
}

等...