Advertisement
Guest User

Infix to Postfix

a guest
May 23rd, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.58 KB | None | 0 0
  1. import java.util.ArrayDeque;
  2. import java.util.Scanner;
  3.  
  4. /**
  5.  * Created by IntelliJ IDEA.
  6.  * User: LAPD
  7.  * Date: 22.5.2018 г.
  8.  * Time: 08:59 ч.
  9.  */
  10. public class _15InfixToPostfix {
  11.     public static void main(String[] args) {
  12.         Scanner console = new Scanner(System.in);
  13.  
  14.         String[] input = console.nextLine()
  15.                 .split("\\s+");
  16.  
  17.         ArrayDeque<String> operatorStack = new ArrayDeque<>();
  18.         StringBuilder output = new StringBuilder();
  19.  
  20.         for (int i = 0; i < input.length; i++) {
  21.             String currentToken = input[i];
  22.  
  23.             if (currentToken.matches("\\d+")) {
  24.                 output.append(currentToken)
  25.                         .append(" ");
  26.             } else if (currentToken.matches("[a-z]+")) {
  27.                 operatorStack.push(currentToken);
  28.             } else if (currentToken.matches("[+\\-*/]")) {
  29.  
  30.                 String stackTopOperator;
  31.                 while (!operatorStack.isEmpty()
  32.                         && ((stackTopOperator = operatorStack.peek()).matches("[a-z]+")
  33.                         || hasGreaterPrecedenceOrEqualAndLeft(currentToken, stackTopOperator))
  34.                         && !"(".equals(stackTopOperator)) {
  35.  
  36.                     output.append(operatorStack.pop())
  37.                             .append(" ");
  38.                 }
  39.  
  40.                 operatorStack.push(currentToken);
  41.             } else if ("(".equals(currentToken)) {
  42.                 operatorStack.push(currentToken);
  43.             } else if (")".equals(currentToken)) {
  44.  
  45.                 String stackTopOperator;
  46.  
  47.                 while (!"(".equals(stackTopOperator = operatorStack.peek())) {
  48.                     output.append(operatorStack.pop())
  49.                             .append(" ");
  50.                 }
  51.  
  52.                 operatorStack.pop();
  53.             }
  54.         }
  55.  
  56.         while (!operatorStack.isEmpty()) {
  57.             output.append(operatorStack.pop())
  58.                     .append(" ");
  59.         }
  60.  
  61.         output.setLength(output.length() - 1);
  62.         System.out.println(output);
  63.     }
  64.  
  65.     private static boolean hasGreaterPrecedenceOrEqualAndLeft(String currentToken, String peek) {
  66.  
  67.         if (currentToken.equals(peek)) {
  68.             return true;
  69.         }
  70.  
  71.         switch (currentToken) {
  72.             case "+":
  73.             case "-":
  74.                 return !("+".equals(peek) || "-".equals(peek));
  75.             case "*":
  76.             case "/":
  77.                 return "(".equals(peek);
  78.             case "(":
  79.                 return true;
  80.             default:
  81.                 return false;
  82.         }
  83.     }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement