【问题标题】:Postfix to Infix program that needs fixing需要修复的中缀程序的后缀
【发布时间】:2016-03-20 16:30:29
【问题描述】:

我需要这个程序的帮助,因为它没有正确编译。

程序应该这样做:

java PostfixToInfix
1 2 3 + *
1*(2+3)

编译时出现这些错误:

    PostfixToInfix.java:64: error: bad operand types for binary operator '-'
                        s.push(o2 - o1);
                                  ^
  first type:  String
  second type: String

PostfixToInfix.java:68: error: bad operand types for binary operator '*'
                        s.push(o1 * o2);
                                  ^
  first type:  String
  second type: String
2 errors

我应该编写多少代码才能使其正常工作?我不确定我的代码有什么问题,它不允许它正确执行功能。 这是我的代码:

import java.util.Scanner;
import java.util.Stack;
public class PostfixToInfix
{
    public static void main(String[] args)
    {
        String[] input = readExpr();        
        if(checkSyntax(input) == true)
        {
            int k = 0;
            Stack<String> s = new Stack<>(); 
            for(int i = 0; i < input.length; ++i)
            {
                if(isOperator(input[i]))
                {
                String o1;
                String o2;
                    if(!(s.empty()))
                    {
                        o1 = s.pop();
                    }
                    else
                    {
                    for(int j = 0; j < i; ++j)
                        {
                        k += input[j].length() + 1;
                        }
                    System.out.println("Too few operands for " + input[i]);
                    writeExpr(input);
                        for(int l = 0; l < k; ++l)
                        {
                        System.out.print(" ");
                        }
                    System.out.println("^");
                    return;
                    }
                    if(!(s.empty()))
                    {
                        o2 = s.pop();
                    }
                    else
                    {
                        for(int j = 0; j < i; ++j)
                        {
                        k += input[j].length() + 1;
                        }
                    System.out.println("Too few operands for " + input[i]);
                    writeExpr(input);
                    for(int l = 0; l < k; ++l)
                    {
                    System.out.print(" ");
                    }
                    System.out.println("^");
                    return;
                    }
                    if(input[i].equals("+"))
                    {
                        s.push(o1 + o2);
                    }
                    else if(input[i].equals("-"))
                    {
                        s.push(o2 - o1);
                    }
                    else
                    {
                        s.push(o1 * o2);
                    }
                }
                else
                {
                s.push(input[i]);
                }
            }
            String Result = s.pop();
            if(!(s.empty()))
            {
                System.out.println("Too few operators to produce a single result");
            }
            else
            {
                System.out.println(Result);
            }

        }


    } // end main

    static String[] readExpr()
    {
        Scanner stdin = new Scanner(System.in);
        String s = stdin.nextLine();

        String[] sA = s.split(" ");
        return sA;

    }

    static void writeExpr(String[] expr)
    {
        for(int i = 0; i < expr.length; ++i)
        {
            System.out.print(expr[i] + " ");
        }
        System.out.println();

    }

    static boolean isOperator(String s)
    {
        if(s.equals("+") || s.equals("-") || s.equals("*"))
        {
            return true;
        }
        return false;
    }

    static boolean checkSyntax(String[] expr)
    {
        int k = 0;
        for(int i = 0; i < expr.length; ++i)
        {
            if(!(isOperator(expr[i])))
            {
                try
                {
                Double.parseDouble(expr[i]); 
                }
                catch (Exception e)
                { 
                for(int j = 0; j < i; ++j)
                {
                    k += expr[j].length() + 1;
                }
                writeExpr(expr);
                for(int l = 0; l < k; ++l)
                {
                System.out.print(" ");
                }
                System.out.println("^");
                System.out.println("Not a number or valid operator");
                return false; 
                }
            }

        }
    return true;
    }

} // end Postfix2


class StringStack
{
    int top;
    String[] pancake;

    StringStack() //constructor for a new empty stack
    {
    top = 0;
    pancake = new String[1000];

    } // end DoubleStack

    boolean empty() //whether the stack is empty
    {
        return top == 0;

    } // end empty

    String pop() //remove and return the top element; throw an error if empty
    {
        if(empty())
        {
            throw new Error("Error");
        }
        top -= 1;
        return pancake[top];

    } // end pop

    void push(String x) //add x to the top of the stack
    {
        if(top < 1000)
        {
        pancake[top] = x;
        top += 1;
        }
        else{
        throw new Error("Error");
        }
    } // end push

} // end StringStack

【问题讨论】:

  • 当重现问题只需要几行代码时,请不要发布 200 行代码。您从错误消息中不明白什么?您认为将 *- 应用于 String 值意味着什么?
  • 阅读错误,它提供了您需要的所有提示。行,代码和原因。你真的没有问题。在为您的特定问题寻求解决方案之前,请三思而后行。避免投反对票。

标签: java compiler-errors stack postfix-notation infix-notation


【解决方案1】:

像这样改变你的代码。

                if(input[i].equals("+"))
                {
                    s.push(o1 + "+" + o2);
                }
                else if(input[i].equals("-"))
                {
                    s.push(o2 + "-" + o1);
                }
                else
                {
                    s.push(o1 + "*" + o2);
                }

但是“1 2 3 + *”的结果是“3+2*1”。 这是另一个问题。

【讨论】:

  • 我收到错误说这不是一个声明,';'是预期的,或 ')' 是预期的
  • @anderkat97 您收到错误提示 what 不是声明?您真的应该能够自己解决此类琐碎的编译错误,而不必匆忙离开这里或其他地方。
猜你喜欢
  • 1970-01-01
  • 2017-07-14
  • 2013-07-05
  • 2019-09-10
  • 2018-05-16
  • 2017-09-01
  • 2011-04-28
  • 1970-01-01
  • 2016-01-24
相关资源
最近更新 更多