如何使用两个堆栈创建一个后缀到postfix

时间:2015-03-05 15:28:33

标签: java data-structures infix-notation

我需要使用两个堆栈来将中缀评估为后缀表达式。一个堆栈用于保存所有操作数,另一个堆栈用于保存所有操作符。

  1. 操作数是运算符的第一个或第二个操作数。如果是运营商 stack为空或如果左括号位于堆栈顶部,则操作数是第一个 操作员的操作数。将操作数推入操作数堆栈。否则, 操作数是运算符的第二个操作数。第一个操作数应该在上面 操作数堆栈,运算符应位于运算符堆栈的顶部。弹出 第一个操作数和来自堆栈的运算符,并形成后缀表达式 表示将运算符应用于其两个操作数。该表达式是一个操作数 可以应用另一个运算符,所以将它推到操作数堆栈上。
  2. 右括号标记中缀操作数表达式的结尾。匹配左 括号应位于运算符堆栈的顶部,以及后缀操作数表达式 对应于中缀操作数表达式应该在操作数堆栈的顶部。 从操作员堆栈中弹出左括号。如果堆栈现在为空或令牌 在堆栈顶部是另一个左括号,操作数堆栈顶部的操作数 假设整个中缀表达式的结束,则是运算符的第一个操作数 没有达到。在这种情况下,不要再做任何事了。否则,后缀表达式 在操作数堆栈之上是运算符的第二个操作数。第一个操作数 应紧挨着它,操作员应位于操作员堆栈的顶部。 从堆栈中弹出操作数和运算符,并形成后缀表达式 表示将运算符应用于其操作数。如上面的1所示,推送此表达式 在操作数堆栈上。

  3. 要处理操作符或左括号,只需将其推入操作员堆栈即可。 简单。 处理完最后一个中缀标记后,操作符堆栈应该为空 操作数堆栈应包含单个后缀表达式。这是后缀 表达式对应于中缀表达式。

  4. 我坚持下一步该做什么。这是我到目前为止所拥有的。我想把它分解成碎片,这样就更容易管理了。

        /**
     * 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());
            }
    
    
        }
    

0 个答案:

没有答案