首先,我會坦率地指出這是一個作業問題。具有堆棧和符號表的表達式解析器
我使用下面的代碼作爲我的基礎上構建一個表達式解析器: 編輯:
public class Interpreter {
public static Double parser(ST<String, Double> variables, String[] inputArray)
{
Double valueHolder;
Stack<String> ops = new Stack<String>();
Stack<Double> vals = new Stack<Double>();
for(int i = 0; i < inputArray.length; i++)
{
String input = inputArray[i];
if (input.equals("(")) ;
else if (input.equals("+")) ops.push(input);
else if (input.equals("-")) ops.push(input);
else if (input.equals("*")) ops.push(input);
else if (input.equals("/")) ops.push(input);
else if (input.equals("sqrt")) ops.push(input);
else if (input.equals(")"))
{
String op = ops.pop();
double v = vals.pop();
if (op.equals("+")) v = vals.pop() + v;
else if (op.equals("-")) v = vals.pop() - v;
else if (op.equals("*")) v = vals.pop() * v;
else if (op.equals("/")) v = vals.pop()/v;
else if (op.equals("sqrt")) v = Math.sqrt(v);
vals.push(v);
}
else if (input.matches("\\D"))
{
valueHolder = variables.get(inputArray[i]);
vals.push(valueHolder);
}
else vals.push(Double.parseDouble(input));
}
return vals.pop();
}
public static String[] getValue(ST<String, Double> variables, String[] inputArray)
{
Double keyHolder;
Double valueHolder;
for(int i = 0; i < inputArray.length; i++)
{
if(variables.contains(inputArray[i]))
{
keyHolder = variables.get(inputArray[i]);
inputArray[i] = keyHolder.toString();
}
else if (!variables.contains(inputArray[i]))
{ if (inputArray[i].matches("\\D")) //if letter
{ if (!inputArray[i].equals("=")) //if not "="
{for (int j = i + 1; j < inputArray.length; j++) //next element
{ if (inputArray[j].matches("\\D")) //if letter
{if (!inputArray[j].matches("=")) //if not "="
{
//get values and do math
}
}
else if (inputArray[j].matches("\\d")) // if digit
{ if (j + 1 >= inputArray.length)
{
valueHolder = Double.parseDouble(inputArray[j]);
variables.put(inputArray[i], valueHolder);
}
else parser(variables, inputArray); //if
}
}
}
}
}
}
return inputArray;
}
public static void main(String[] args)
{
ST<String, Double> variables = new ST<String, Double>();
while(!StdIn.isEmpty())
{
String input = StdIn.readLine();
String[] inputArray = input.split("\\s+"); // read a line and split it by whitespace
inputArray = getValue(variables, inputArray); // remove any variables and replace with their associated values
double y = parser(inputArray);
System.out.println(y);
}
}
}
控制檯輸入會是這樣的:
A = 5
B = 10
C = A + B
D = C * C
print(D)
在這種情況下,控制檯的輸出是225.我的問題是我無法弄清楚如何拆分inpu t在符號表的鍵和值之間。用於輸入密鑰和值的API是void put(Key key, Value v)
,如果密鑰設置爲null,則密鑰將被刪除。先謝謝了。
我試過了,但我無法讓拆分工作。我編輯了我的問題以反映我創建的代碼的合併。當我調試代碼時,我發現無論我做什麼,第一個參數都被識別爲'Stack',第二個參數被分解爲一個數組作爲'S tack',每個字母都是s的一個元素.Array []'。無論你是否及時看到這一點,謝謝你的幫助。 – rice2007 2013-05-07 01:56:25
作爲Stack的第一個參數和第二個S T a c k?那是在你輸入控制檯之後嗎?你的控制檯輸入是什麼? – 2013-05-07 03:15:23
我的控制檯輸入第一次是'A = 5'' B = 10'' C = A + B'' D = C * C'' print(D)',每個塊在一個單獨的輸入線上。然後我嘗試了'A = 5'。每次都有同樣的結果。 – rice2007 2013-05-07 03:26:20