我無法想到將字符串矢量轉換爲賦值語句的右值的有效方法。因此,例如,我有三個元素的向量「5」,「*」,「3」,所以我需要的是一個賦值語句,基本上是等同於提前以下將字符串矢量轉換爲分配聲明的右值
int myInteger = 5 * 3;
感謝;
我無法想到將字符串矢量轉換爲賦值語句的右值的有效方法。因此,例如,我有三個元素的向量「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;
,現在你應該只檢查什麼操作是在c和執行它。
我假設你知道變量的順序或者可以確定變量的順序以及操作符的順序。我也會假設,因爲你使用的是一個向量,所以可以有多個變量(不是重點:))。
鑑於此,您只需簡單地轉換變量並編寫邏輯以按正確的順序(按照您的語言的運算符優先級指定)應用運算符。
假設我們正在使用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>
這應該給你一個關於如何完成你給定的任務的公平想法。通過一點玩法和修補,你可以包含對大多數運算符的支持以及括號。
謝謝你的詳細回覆,我將不得不仔細閱讀它才能理解(特別是我根本不知道任何Java :)),我想在將矢量的所有元素連接成一個字符串的行中。然後找到一種將該字符串轉換爲右值的方法。我還應該提到,操作順序將始終遵循向量的索引,括號也在那裏。 – Jeanno
你基本上正在編寫一個運行時編譯器,它需要選取字符串來確定在給定操作數上執行什麼操作。通過將矢量連接成一個字符串,你只需要將它解析回運算符和操作數。事實上,保持它的方式實際上更快。 –