尝试将中缀转换为后缀返回向后输出

Posted

技术标签:

【中文标题】尝试将中缀转换为后缀返回向后输出【英文标题】:Trying to convert infix to postfix returns backwards output 【发布时间】:2019-03-15 01:58:43 【问题描述】:

我正在创建一个将中缀表达式转换为后缀表达式的逆波兰表示法计算器。但是,我的运营商正在向后输出。例如,我输入的中缀为“1+5*(3*2)”,当我运行程序时,我得到输出“+ 1 * * 3 2 5”,而它应该是“1 5 3 2 + * +" 我不知道为什么。

public class RPNcalc extends Stack

    public static void main( String[] args)
    
      String infix = "1+5*(3*2)";
      RPNcalc test = new RPNcalc();
      String output = test.ConvertToPostfix(infix);
      System.out.println(output);
    


    public static String ConvertToPostfix(String infix)
    
      Stack stack1 = new Stack();
      char ch;
      String postfix = "";

      for (int i = 0; i < infix.length(); i++)
      
        ch = infix.charAt(i);

        if (isOperator(ch))
        
          postfix = postfix + ch + " ";
        
        else if (ch == '(')
        
          stack1.push(ch);
        
        else if (ch == ')')
        
          while (stack1.peek() != '(')
          
            postfix = postfix + stack1.pop() + " ";
          
          stack1.pop();
        
        else
        
          while (!stack1.isEmpty() && !(stack1.peek() == '(') && (precedence(ch) <= precedence(stack1.peek())))
          
            postfix = postfix + stack1.pop() + " ";
          
          stack1.push(ch);
        
      
      while (!stack1.isEmpty())
      
        postfix = postfix + stack1.pop();
      
      return postfix;
    

【问题讨论】:

【参考方案1】:

只有一个“!”缺失:

必须是:if( ! isOperator( ch ) ) …

并且输出是正确的: 1 5 3 2 * * + 计算为 31

*和+之间的间距有问题postfix + ' ' + stack1.pop() ?

调车场算法的一个很好的描述在这里找到:https://en.wikipedia.org/wiki/Shunting-yard_algorithm#Detailed_example

顺便说一句,在 Java 中,函数名应该以小写字母开头:convertToPostfix( String infix )

【讨论】:

以上是关于尝试将中缀转换为后缀返回向后输出的主要内容,如果未能解决你的问题,请参考以下文章

将中缀表达式转换为后缀表达式

如何在程序中将中缀表达式转换为后缀表达式

中缀表达式转换成后缀表达式并求值

在 Scala 中将中缀转换为后缀表示法

PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)

中缀表达式转换为后缀表达式的算法