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

String 将字符串向量转换为赋值语句的右值,string,vector,rvalue,String,Vector,Rvalue,我想不出一种有效的方法将字符串向量转换为赋值语句的右值。举个例子,我有一个向量,有三个元素“5”,“*”,“3”,所以我需要的是一个赋值语句,它基本上等价于下面的 int myInteger = 5 * 3; 提前感谢 必须逐个元素进行分析。假设您知道向量将有三个元素(字符串),因此可以执行以下操作: vector<string> v = {"5","*", "3"}; int x, y; char c; stringstream(a); string T = v[0]+v[1]+

我想不出一种有效的方法将字符串向量转换为赋值语句的右值。举个例子,我有一个向量,有三个元素“5”,“*”,“3”,所以我需要的是一个赋值语句,它基本上等价于下面的

int myInteger = 5 * 3;

提前感谢

必须逐个元素进行分析。假设您知道向量将有三个元素(字符串),因此可以执行以下操作:

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;
向量v={“5”、“*”、“3”}; int x,y; 字符c; 溪流(a);; 字符串T=v[0]+v[1]+v[2]; a>x>>c>>y;
现在,您应该检查c中的操作并执行它。

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

考虑到这一点,您只需强制转换变量并编写逻辑,以正确的顺序应用运算符(由语言的运算符优先级指定)

假设我们使用的是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>

变量foo=5*4+16/2-3*2//应该是22岁
变量条=[“5”、“*”、“4”、“+”、“16”、“/”、“2”、“-”、“3”、“*”、“2”];
var done=parseVec(bar)//应该算到22
//javascript中没有向量,因此我们将使用一个数组来演示
//所有解析都假定数组中的值是十进制的,而不是八进制或十六进制的
函数parseVec(数组){
var结果,i,h,j,作用;
var newarray=[];
//基于运算顺序的决策……所有乘法运算都会发生
//先是除法,然后是加法,等等。。。
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=数组.indexOf(“-”);
action=“-”;
}否则
返回useParseFloat(数组[0])?parseFloat(数组[0],10):parseInt(数组[0],10);
//对数组[i]前面和后面的值进行操作。。。
h=useParseFloat(数组[i-1])?parseFloat(数组[i-1],10):parseInt(数组[i-1],10);
j=useParseFloat(数组[i+1])?parseFloat(数组[i+1],10):parseInt(数组[i+1],10);
开关(动作)
{
案例“*”:
结果=h*j;
打破
案例“/:
结果=h/j;
打破
格“+”:
结果=h+j;
打破
案例“-”:
结果=h-j;
打破
}
//重新创建用于递归的数组
for(var i2=0;i2=0&&val.indexOf(“.”<(val.length-1))?真:假;
}
你可以


这会让你对如何完成既定任务有一个合理的认识。通过一些游戏和修补,您可以包括对大多数运算符和括号的支持。

感谢您的详细回复,我必须仔细阅读才能理解(尤其是我根本不懂Java:)。我正在考虑将向量的所有元素连接成一个字符串。然后找到将该字符串转换为右值的方法。我还应该提到的是,操作的顺序将始终遵循向量的索引,括号也在那里。实际上,您正在编写一个运行时编译器,它需要通过字符串来确定要对给定的操作数执行哪些操作。通过将向量连接成字符串,您只需将其解析回运算符和操作数。事实上,保持现状会更快。