0

我想不出一种有效的方法来将字符串向量转换为赋值语句的右值。例如,我有一个包含三个元素“5”、“*”、“3”的向量,所以我需要一个赋值语句,它基本上等同于以下内容

int myInteger = 5 * 3;

提前致谢;

4

2 回答 2

1

我假设您知道变量的顺序,或者可以确定变量的顺序以及运算符的顺序。我还假设,因为您使用的是向量,所以可以有多个变量(不是重点:))。

鉴于此,您只需转换变量并编写逻辑以正确顺序应用运算符(由您的语言的运算符优先级指定)。

假设我们正在使用 Javascript(请参见此处的优先级)。为简单起见,我们将只处理乘法、除法、加法和减法运算符。

<script>
var foo = 5*4+16/2-3*2; //should be 22
var bar = ["5","*","4","+","16","/","2","-","3","*","2"];
var done = parseVec(bar); //should calculate to 22

//there are no vectors in javascript, so we'll go with an array to demonstrate
//all parsing assumes that values in the array are in decimal, not octal or hex
function parseVec (array) {
  var result, i, h, j, action;
  var newarray = [];
  
  //decision based on order of operations...all multiplication will happen 
  //first, then division, then addition, etc...
  if (array.indexOf("*") > 0 && array.indexOf("*") < (array.length-1)) {
    i = array.indexOf("*");
    action = "*";
  } else if (array.indexOf("/") > 0 && array.indexOf("*/") < (array.length-1)) {
    i = array.indexOf("/");
    action = "/";
  } else if (array.indexOf("+") > 0 && array.indexOf("+") < (array.length-1)) {
    i = array.indexOf("+");
    action = "+";
  } else if (array.indexOf("-") > 0 && array.indexOf("-") < (array.length-1)) {
    i = array.indexOf("-");
    action = "-";
  } else
    return useParseFloat(array[0]) ? parseFloat(array[0], 10) : parseInt(array[0], 10);
  
  //operate on the value preceding and following array[i]...
  h = useParseFloat(array[i-1]) ? parseFloat(array[i-1], 10) : parseInt(array[i-1], 10);
  j = useParseFloat(array[i+1]) ? parseFloat(array[i+1], 10) : parseInt(array[i+1], 10);
  switch (action)
  {
    case "*":
        result = h * j;
        break;
    case "/":
        result = h / j;
        break;
    case "+":
        result = h + j;
        break;
    case "-":
        result = h - j;
        break;
  }
  
  //recreate the array for recursion
  for(var i2 = 0; i2 < array.length; i2++)
  {
    if (i2 == i)
      newarray.push(result.toString());
    else if (i2 != (i-1) && i2 != (i+1))
      newarray.push(array[i2]);
  }
  return parseVec(newarray);
}

//should I parse this as an int or float?
function useParseFloat(val) {
  return (val.indexOf(".") >= 0 && val.indexOf(".") < (val.length-1)) ? true : false;
}
</script>

您可以在 JSBin 上运行此代码

这应该让您对如何完成给定的任务有一个公平的想法。通过一些尝试和修改,您可以包括对大多数运算符和括号的支持。

于 2012-09-28T19:19:20.053 回答
0

您必须逐个元素解析。假设您知道您的向量将包含三个元素(字符串),因此您可以这样做:

vector<string> v = {"5","*", "3"};
int x, y;
char c;
stringstream(a);
string T = v[0]+v[1]+v[2];
a << T;
a >> x >> c >> y;

现在你应该检查c中的操作并执行它。

于 2012-09-28T17:39:48.037 回答