将字符串向量转换为赋值语句的R值

时间:2012-09-28 17:33:04

标签: string vector rvalue

我无法想到将字符串向量转换为赋值语句的右值的有效方法。所以例如,我有一个带有三个元素“5”,“*”,“3”的向量,所以我需要的是一个赋值语句,它基本上等同于以下

int myInteger = 5 * 3;

提前致谢;

2 个答案:

答案 0 :(得分:1)

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

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

假设我们使用的是Javascript(see precedence here)。为简单起见,我们只处理乘法,除法,加法和减法运算符。

<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>

你可以run this code on JSBin

这应该让您对如何完成给定任务有一个很好的了解。通过一些游戏和修补,您可以包括对大多数操作符和括号的支持。

答案 1 :(得分: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中的操作并执行它。