1224号(電卓3)
26708 ワード
質問元: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大流量が計算機2の問題に等しい. しかし、ここではカッコ処理が必要であり、そのためにまず入力された値をスタックに格納する. スタックに格納し、閉じたカッコが表示されるとpop()は、開いたカッコが表示されるまでインデックスに格納します.その後、インデックスを既存の計算機の2ビット表現処理ロジックに変換し、中位数式を生成します.作成した値はインデックスに返され、中位数式に変換された部分は変換ロジックに入ることができないため、文字列として作成されスタックに格納されます.その後の処理ロジックは、計算機2と同じである. これはのブログ記事を書く考えで、必ずしもインデックスを使わなくてもスタックを使うことができます.
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;
}
}
Reference
この問題について(1224号(電卓3)), 我々は、より多くの情報をここで見つけました https://velog.io/@ghc1124/SW-Expert-Academy-1224번계산기3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol