我想不出一种有效的方法来将字符串向量转换为赋值语句的右值。例如,我有一个包含三个元素“5”、“*”、“3”的向量,所以我需要一个赋值语句,它基本上等同于以下内容
int myInteger = 5 * 3;
提前致谢;
我假设您知道变量的顺序,或者可以确定变量的顺序以及运算符的顺序。我还假设,因为您使用的是向量,所以可以有多个变量(不是重点:))。
鉴于此,您只需转换变量并编写逻辑以正确顺序应用运算符(由您的语言的运算符优先级指定)。
假设我们正在使用 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 上运行此代码。
这应该让您对如何完成给定的任务有一个公平的想法。通过一些尝试和修改,您可以包括对大多数运算符和括号的支持。
您必须逐个元素解析。假设您知道您的向量将包含三个元素(字符串),因此您可以这样做:
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中的操作并执行它。