我需要使用两个堆栈来将中缀评估为后缀表达式。一个堆栈用于保存所有操作数,另一个堆栈用于保存所有操作符。
右括号标记中缀操作数表达式的结尾。匹配左 括号应位于运算符堆栈的顶部,以及后缀操作数表达式 对应于中缀操作数表达式应该在操作数堆栈的顶部。 从操作员堆栈中弹出左括号。如果堆栈现在为空或令牌 在堆栈顶部是另一个左括号,操作数堆栈顶部的操作数 假设整个中缀表达式的结束,则是运算符的第一个操作数 没有达到。在这种情况下,不要再做任何事了。否则,后缀表达式 在操作数堆栈之上是运算符的第二个操作数。第一个操作数 应紧挨着它,操作员应位于操作员堆栈的顶部。 从堆栈中弹出操作数和运算符,并形成后缀表达式 表示将运算符应用于其操作数。如上面的1所示,推送此表达式 在操作数堆栈上。
要处理操作符或左括号,只需将其推入操作员堆栈即可。 简单。 处理完最后一个中缀标记后,操作符堆栈应该为空 操作数堆栈应包含单个后缀表达式。这是后缀 表达式对应于中缀表达式。
我坚持下一步该做什么。这是我到目前为止所拥有的。我想把它分解成碎片,这样就更容易管理了。
/**
* Evaluates the specified postfix expression. If an operand is encountered,
* it is pushed onto the stack. If an operator is encountered, two operands
* are popped, the operation is evaluated, and the result is pushed onto the
* stack.
*
* @param expr
* string representation of a postfix expression
* @return value of the given expression
*/
public String evaluate(String expr) {
// A variable to hold the resulting postfix expression
String result;
// A variable to hold individual tokens in the infix expression
String token;
// Scanner to read the users input expression
Scanner parser = new Scanner(expr);
// Variables to hold the first and second operands
String op1, op2;
// Reading the input one character at a time
while (parser.hasNext()) {
token = parser.next();
// Performing postfix calculations
// Pushing values on the stacks
if (token.equals("(")) {
operatorStack.push(token);
}
else if (!isOperator(token)){
operandStack.push(token);
}
else{
operatorStack.push(token);
}
//Part 1
if (operatorStack.isEmpty() || operatorStack.peek().equals("(")){
operandStack.push(token);
}
else{
op2 = (operandStack.peek());
}
}