1224号(電卓3)


質問元:https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14tDX6AFgCFAYD&categoryId=AV14tDX6AFgCFAYD&categoryType=CODE&problemTitle=1224&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Stack;

public class Solution {

    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int problemNum = 1;

        for (int i = 0; i < 10; i++) {
            int size = Integer.parseInt(reader.readLine());
            StringBuilder tempString = new StringBuilder();
            Stack<String> temp = new Stack<>();
            // 중위 표기 -> 후위 표기
            for (String str : reader.readLine().split("")) {
                if (str.equals(")")) {
                    ArrayDeque<String> arrayDeque = new ArrayDeque<>();
                    StringBuilder tempString2 = new StringBuilder();
                    while (!temp.peek().equals("(")) {
                        arrayDeque.offer(temp.pop());
                    }
                    temp.pop();
                    arrayDeque = stackProcess(arrayDeque);
                    while (!arrayDeque.isEmpty()) {
                        tempString2.append(arrayDeque.poll());
                    }
                    temp.push(tempString2.toString());
                } else {
                    temp.push(str);
                }
            }

            tempString.setLength(0);

            while (!temp.isEmpty()) {
                tempString.append(temp.pop());
            }

            // 중위 표현 계산
            Stack<Integer> calcStack = new Stack<>();
            for (char c : tempString.toString().toCharArray()) {
                if (c == '+' || c == '*') {
                    int head = ' ';
                    int tail = ' ';

                    int result = 0;

                    if (!calcStack.isEmpty()) tail = calcStack.pop();
                    if (!calcStack.isEmpty()) head = calcStack.pop();

                    if (c == '+') result = head + tail;
                    else result = head * tail;

                    calcStack.push(result);
                } else {
                    calcStack.push(c - '0');
                }
            }

            sb.append("#").append(problemNum++).append(" ");
            sb.append(calcStack.pop()).append("\n");
        }

        System.out.println(sb);
    }

    private static ArrayDeque<String> stackProcess(ArrayDeque<String> arrayDeque) {
        ArrayDeque<String> deque = new ArrayDeque<>();
        Stack<String> stack = new Stack<>();

        String prev = "";

        while (!arrayDeque.isEmpty()) {
            String current = arrayDeque.pollLast();
            if (current.equals("*") || current.equals("+")) {
                if (!stack.isEmpty()) {
                    prev = stack.peek();
                    if (prev.equals(current)) {
                        deque.offer(stack.pop());
                    } else if (prev.equals("*")) { // * -> +
                        while (!stack.isEmpty()) {
                            deque.offer(stack.pop());
                        }
                    }
                }
                stack.push(current);
            } else {
                deque.offer(current);
            }
        }

        while (!stack.isEmpty()) {
            deque.offer(stack.pop());
        }

        return deque;
    }

}
  • 大流量が計算機2の問題に等しい.
  • しかし、ここではカッコ処理が必要であり、そのためにまず入力された値をスタックに格納する.
  • スタックに格納し、閉じたカッコが表示されるとpop()は、開いたカッコが表示されるまでインデックスに格納します.その後、インデックスを既存の計算機の2ビット表現処理ロジックに変換し、中位数式を生成します.作成した値はインデックスに返され、中位数式に変換された部分は変換ロジックに入ることができないため、文字列として作成されスタックに格納されます.その後の処理ロジックは、計算機2と同じである.
  • これは
  • のブログ記事を書く考えで、必ずしもインデックスを使わなくてもスタックを使うことができます.