Инфикс для постфикса с использованием стеков - Java - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь изучить и реализовать некоторые практические способы использования стеков, и я делаю небольшую программу, которая принимает уравнение и преобразует его в постфиксную запись. Я знаю, как работает постфиксная нотация, стеки и приоритет, поэтому синтаксический подход, который я выбрал, кажется, имеет смысл для меня, однако кажется, что он распечатывается в виде префиксной нотации с некоторыми дубликатами, иногда это действительно странно. Буду признателен за любую помощь, и я оставлю вам весь свой код ниже, спасибо.

import java.util.Scanner;
import java.util.Stack;

public class Main {

    public static void main(String[] args) {
        infixToPostfix();
    }

    private static int Precedence(char character) {

        System.out.print("" + character);
        switch (character) {
        case '+':
        case '-':
            return 1;
        case '/':
        case '*':
            return 2;
        case '^':
            return 3;
        }
        return -1;
    }

    private static String infixToPostfix() {

        Scanner scanner = new Scanner(System.in);
        Stack<Character> operatorStack = new Stack<>();
        System.out.println("please enter your equation");
        String equation = scanner.nextLine();
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < equation.length(); i++) {
            char ch = equation.charAt(i);
            if (Character.isDigit(ch)) {
                result.append(ch);
            } else if (ch == '(') {
                operatorStack.push(ch);
            } else if (operatorStack.isEmpty()
                    && !Character.isDigit(ch)) {
                operatorStack.push(ch);
            } else {
                while (!operatorStack.isEmpty()) {
                    if (!Character.isDigit(ch)
                            && Precedence(
                                    ch) < operatorStack
                                            .peek()) {
                        result.append(operatorStack.pop());
                    } else if (!Character.isDigit(ch)
                            && Precedence(
                                    ch) > operatorStack
                                            .peek()) {
                        operatorStack.push(ch);
                    } else if (ch == ')') {
                        result.append(operatorStack.pop());
                    }
                }
            }
        }

        System.out.println(result);
        return result.toString();
    }


}
2*(3+1) // input
++23(*1 // output
31+2* // expected output

Process finished with exit code 0

...