我有此代碼將中綴表達式轉換爲後綴表達式之後,我想評估表達式並找到值,因此我所做的是要求用戶在例如。 A + B * C + D方式然後我使用一種方法轉換它,然後我要求用戶輸入A,B,C和D的值,以便我可以評估表達式,當用戶輸入值時,我將它們放置在字符串數組,並嘗試評估它,但我卡在這裏,並嘗試了很多方法來做評估,但沒有運氣!這裏是我的代碼:從中綴表達式轉換後評估postfix表達式
public class Main {
private Stack stack = new Stack();
char symbol;
String postfix = "";
String prefix;
///////////////////////////////////////////////////////////////////////////////////////////////
public char prefixLetterOrOprand(char ch) {
if (Character.isLetter(ch))
prefix = ch + prefix;
else {
while (!isEmpty() && charValue(ch) <= charValue((char) stack.peek()))
prefix = stack.pop() + prefix;
stack.push(ch);
}
return ch;
}
///////////////////////////////////////////////////////////////////////////////////////////////
public String toPostfix(String infix) {
for (int i = 0; i < infix.length(); ++i) {
symbol = infix.charAt(i);
isLetterOrOprand(symbol);
}
while (!isEmpty())
postfix = postfix + stack.pop();
return postfix;
}
///////////////////////////////////////////////////////////////////////////////////////////////
public int evaluate(String expression, int[] value) {
String a = convertExpressionToValues(expression, value);
int sum = 0;
Stack<Character> operand = new Stack<>();
Stack<Character> operator = new Stack<>();
for (int i = 0; i <= expression.length() - 1; i++) {
if (Character.isLetterOrDigit(expression.charAt(i)) == true) {
operand.push(a.charAt(i));
System.out.println("Letters: " + operand.peek());
} else {
if (operator.isEmpty()) {
operator.push(expression.charAt(i));
}
if (!operator.isEmpty() && charValue(expression.charAt(i)) >= charValue(operator.peek())) {
operator.push(expression.charAt(i));
sum = Integer.parseInt(a);
}
System.out.println("Digits: " + operator.peek());
}
}
return sum;
}
private String convertExpressionToValues(String expression, int[] value) {
StringBuilder a = new StringBuilder(expression);
a.replace(a.indexOf("A"), a.indexOf("A") + 1, Integer.toString(value[0]));
a.replace(a.indexOf("B"), a.indexOf("B") + 1, Integer.toString(value[1]));
a.replace(a.indexOf("C"), a.indexOf("C") + 1, Integer.toString(value[2]));
a.replace(a.indexOf("D"), a.indexOf("D") + 1, Integer.toString(value[3]));
return a.toString();
}
///////////////////////////////////////////////////////////////////////////////////////////////
public char isLetterOrOprand(char ch) {
if (Character.isLetter(ch))
postfix = postfix + ch;
else {
while (!isEmpty() && charValue(ch) <= charValue((char) stack.peek()))
postfix = postfix + stack.pop();
stack.push(ch);
}
return ch;
}
///////////////////////////////////////////////////////////////////////////////////////////////
public int charValue(char ch) {
if (ch == '+' || ch == '-')
return 1;
else if (ch == '*' || ch == '/')
return 2;
return 0;
}
public boolean isEmpty() {
return stack.size() == 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Please Enter a value");
String value = scan.next();
Main main = new Main();
System.out.println("Postfix Value: " + main.toPostfix(value));
System.out.println("-----------------------------------");
System.out.println("Prefix Value: " + main.toPrefix(value));
System.out.println("Enter A Value For A: ");
int a = scan.nextInt();
System.out.println("Enter A Value For B: ");
int b = scan.nextInt();
System.out.println("Enter A Value For C: ");
int c = scan.nextInt();
System.out.println("Enter A Value For D: ");
int d = scan.nextInt();
int[] values = { a, b, c, d };
main.evaluate(values);
}
}
我建議你將值保存爲數字,而不是字符串,因爲你想用它們進行算術運算。你也應該使用'Map'而不是數組,以便你可以通過名字查找值。 –
我試圖使堆棧達到我的目標,但我的charValue(char ch)方法不支持,所以如果有任何更好的建議請諮詢。 –
'charValue()'方法的用途是什麼? –