2012-09-28 60 views
0

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

int myInteger = 5 * 3; 

感谢;

回答

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和执行它。

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

这应该给你一个关于如何完成你给定的任务的公平想法。通过一点玩法和修补,你可以包含对大多数运算符的支持以及括号。

+0

谢谢你的详细回复,我将不得不仔细阅读它才能理解(特别是我根本不知道任何Java :)),我想在将矢量的所有元素连接成一个字符串的行中。然后找到一种将该字符串转换为右值的方法。我还应该提到,操作顺序将始终遵循向量的索引,括号也在那里。 – Jeanno

+0

你基本上正在编写一个运行时编译器,它需要选取字符串来确定在给定操作数上执行什么操作。通过将矢量连接成一个字符串,你只需要将它解析回运算符和操作数。事实上,保持它的方式实际上更快。 –