首页 > Java > java教程 > 如何处理中缀到后缀转换中的括号?

如何处理中缀到后缀转换中的括号?

Mary-Kate Olsen
发布: 2024-11-17 19:59:02
原创
222 人浏览过

How to Handle Parentheses in Infix to Postfix Conversions?

处理中缀到后缀转换中的括号

将中缀表达式转换为后缀表达式需要仔细处理括号。括号的存在给确定正确的运算顺序带来了挑战。为了解决这个问题,可以采用以下方法:

括号处理机制

推入左括号:当遇到左括号时,将其推入运算符堆栈。

处理右括号:遇到右括号时:

  1. 从堆栈中弹出运算符并将它们附加到输出字符串,直到遇到左括号。
  2. 如果没有找到左括号而堆栈为空,则表示右括号不匹配。
  3. 如果找到左括号,则将其从堆栈中弹出。
  4. 弹出来自输入堆栈的右括号。

代码实现

以下 Java 代码演示了如何修改 toPostFix() 方法来处理括号:

public String toPostFix() {
    StringBuilder postfixstr = new StringBuilder();

    Stack<Token> in_fix = new Stack<>();
    Stack<Token> post_fix = new Stack<>();

    for (int i = tokens.length - 1; i >= 0; i--) {
        t = new Token(tokens[i]);
        in_fix.push(t);
    }

    //there are still tokens to process
    while (!in_fix.empty()) {
        // is a number
        if (in_fix.peek().type == 1) {     
            postfixstr.append(in_fix.pop().toString());
        } 

        // is an operator and the stack is empty
        else if (in_fix.peek().type == 3 && post_fix.empty()) {   
            post_fix.push(in_fix.pop());
        } 

        // is an operator that has higher priority than the operator on the stack
        else if (in_fix.peek().type == 3 && in_fix.peek().isOperator() > post_fix.peek().isOperator()) {
            post_fix.push(in_fix.pop());
        } 

        // is an operator that has lower priority than the operator on the stack
        else if (in_fix.peek().type == 3 && in_fix.peek().isOperator() <= post_fix.peek().isOperator()) {
            postfixstr.append(post_fix.pop());
            post_fix.push(in_fix.pop());
        } 

        // opening (
        else if (in_fix.peek().type == 4) {   
            post_fix.push(in_fix.pop());
        }

        // closing )
        else if(in_fix.peek().type == 5){
            while(!(post_fix.isEmpty() || post_fix.peek().type == 4)){
                 postfixstr.append(post_fix.pop());
            }
            if (post_fix.isEmpty())
                ; // ERROR - unmatched )
            else
                post_fix.pop(); // pop the (
            in_fix.pop(); // pop the )
        }

        //puts the rest of the stack onto the output string
        if (in_fix.empty()) {
            while (!post_fix.empty()) {
                postfixstr.append(post_fix.pop());
            }
        }
    }

    return postfixstr.toString();
}
登录后复制

通过实现这些步骤,toPostFix()方法可以有效地处理涉及括号的表达式,确保操作顺序正确并生成所需的后缀表达式。

以上是如何处理中缀到后缀转换中的括号?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板