Java 前缀表达式以同时计算多个表达式 私有类InputListener实现ActionListener { 已执行的公共无效操作(操作事件e) { 堆栈操作数堆栈=新堆栈(); 堆栈运算符堆栈=新堆栈(); 字符串输入=inputTextField.getText(); StringTokenizer strToken=新的StringTokenizer(输入“”,false); while(strToken.hasMoreTokens()) { 字符串i=strToken.nextToken(); 整数操作数; 字符算子; 尝试 { 操作数=整数.parseInt(i); 操作数堆栈。推送(操作数); } 捕获(NumberFormatException nfe) { 运算符=i.charAt(0); 操作员定位推送(操作员); } } int result=sum(操作数堆栈、运算符堆栈); resultTextField.setText(Integer.toString(result)); }
我的前缀表达式代码一次只计算一个表达式(即+3 1)。我希望它计算一个用户输入表达式中的多个表达式(即。*+16 4+3 1)。我如何编辑提供的代码以使其计算多个表达式?感谢您的帮助。要使您的程序执行更多操作,您可以使用循环继续对Java 前缀表达式以同时计算多个表达式 私有类InputListener实现ActionListener { 已执行的公共无效操作(操作事件e) { 堆栈操作数堆栈=新堆栈(); 堆栈运算符堆栈=新堆栈(); 字符串输入=inputTextField.getText(); StringTokenizer strToken=新的StringTokenizer(输入“”,false); while(strToken.hasMoreTokens()) { 字符串i=strToken.nextToken(); 整数操作数; 字符算子; 尝试 { 操作数=整数.parseInt(i); 操作数堆栈。推送(操作数); } 捕获(NumberFormatException nfe) { 运算符=i.charAt(0); 操作员定位推送(操作员); } } int result=sum(操作数堆栈、运算符堆栈); resultTextField.setText(Integer.toString(result)); },java,expression,Java,Expression,我的前缀表达式代码一次只计算一个表达式(即+3 1)。我希望它计算一个用户输入表达式中的多个表达式(即。*+16 4+3 1)。我如何编辑提供的代码以使其计算多个表达式?感谢您的帮助。要使您的程序执行更多操作,您可以使用循环继续对操作数堆栈进行操作,并将上一个结果的结果推送到堆栈中。我将println语句留在堆栈中,以便您可以查看其内容我还修改了你的方法,使它可以放在一个独立的main方法中 你应该研究一下调车场算法,它的实现非常有趣,这有点像你在这里所做的 然后从堆栈中弹出并将其传递给方法。将
操作数堆栈进行操作,并将上一个结果的结果推送到堆栈中。我将println
语句留在堆栈中,以便您可以查看其内容我还修改了你的方法,使它可以放在一个独立的main
方法中
你应该研究一下调车场算法,它的实现非常有趣,这有点像你在这里所做的
然后从堆栈中弹出并将其传递给方法。将更改堆栈的代码保存在一个位置
private static int operate(Integer a, Integer b, char operator) {
switch(operator) {
case '-':
return b - a;
case '+':
return a + b;
default:
throw new IllegalStateException("Unknown operator '"+operator+"'");
}
}
方法sum
在做什么?@isnot2bad sum方法计算操作数的和或乘积。我在sum方法中使用if…else if语句进行计算。例如:if(operator='+'){operan1=operanstack.pop();operan2=operanstack.pop();result=operan2+operan1;}。我如何编辑代码以使其同时计算多个表达式?谢谢。我现在正在实现您的代码,但不确定您给我的最后一行代码放在哪里:operateStack.push(operate(operate(operate.pop(),operatorStack.pop(),operatorStack.pop());。我在哪里实现它?@Jeremy它将取代operateStack.push(operate(Operator(operatorStack,operatorStack));
在while循环中。我还需要使用resultTextField.setText();语句将结果存储在GUI中,但您已将其删除。我现在如何使用它?@Jeremy将其添加回…与以前相同的方式。我将其添加回,并将“result”替换为“operatorStack.peek()),但现在还有另一个问题;它不能使用多个运算符正确计算。前缀表达式*+16 4+3 1应等于80,但它等于128。如何更正此问题?
public static void main(String[] args) {
Stack<Integer> operandStack = new Stack<Integer>();
Stack<Character> operatorStack = new Stack<Character>();
String input = "12 + 13 - 4";
StringTokenizer strToken = new StringTokenizer(input, " ", false);
while (strToken.hasMoreTokens()) {
String i = strToken.nextToken();
int operand;
char operator;
try {
operand = Integer.parseInt(i);
operandStack.push(operand);
} catch (NumberFormatException nfe) {
operator = i.charAt(0);
operatorStack.push(operator);
}
}
// loop until there is only 1 item left in the operandStack, this 1 item left is the result
while(operandStack.size() > 1) {
// some debugging println
System.out.println("Operate\n\tbefore");
System.out.println("\t"+operandStack);
System.out.println("\t"+operatorStack);
// perform the operations on the stack and push the result back onto the operandStack
operandStack.push(operate(operandStack, operatorStack));
System.out.println("\tafter");
System.out.println("\t"+operandStack);
System.out.println("\t"+operatorStack);
}
System.out.println("Result is: " + operandStack.peek());
}
/**
* Performs math operations and returns the result. Pops 2 items off the operandStack and 1 off the operator stack.
* @param operandStack
* @param operatorStack
* @return
*/
private static int operate(Stack<Integer> operandStack, Stack<Character> operatorStack) {
char op = operatorStack.pop();
Integer a = operandStack.pop();
Integer b = operandStack.pop();
switch(op) {
case '-':
return b - a;
case '+':
return a + b;
default:
throw new IllegalStateException("Unknown operator '"+op+"'");
}
}
private static int operate(Integer a, Integer b, char operator) {
switch(operator) {
case '-':
return b - a;
case '+':
return a + b;
default:
throw new IllegalStateException("Unknown operator '"+operator+"'");
}
}
operandStack.push(operate(operandStack.pop(), operandStack.pop(), operatorStack.pop()));