728x90
문자열로 이루어진 계산식이 주어질 때, 이 계산식을 후위 표기식으로 바꾸어 계산하는 프로그램을 작성하시오.
예를 들어
“3+4+5*6+7”
라는 문자열로 된 계산식을 후위 표기식으로 바꾸면 다음과 같다.
"34+56*+7+"
변환된 식을 계산하면 44를 얻을 수 있다.
문자열 계산식을 구성하는 연산자는 +, * 두 종류이며 피연산자인 숫자는 0 ~ 9의 정수만 주어진다.
[입력]
각 테스트 케이스의 첫 번째 줄에는 테스트 케이스의 길이가 주어진다. 그 다음 줄에 바로 테스트 케이스가 주어진다.
총 10개의 테스트 케이스가 주어진다.
[출력]
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 답을 출력한다.
입력101
9+5*2+1+3*3*7*6*9*1*7+1+8*6+6*1*1*5*2*4*7+4*3*8*2*6+7*8*4*5+3+7+2+6+5+1+7+6+7*3*6+2+6+6*2+4+2*2+4*9*3
79
4+4*3*4*9+2+7*4*7+7*7*9*5*2+8*8+2*6*7*3*7*9*3*4+8+8*9+3+9+6+9+4*1+6*3+5+1+7+5*1
...
출력
#1 28134
#2 195767
...
package a0820;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Solution_1223_계산기_서울_12반_이서영 {
static int n;
public static void main(String[] args) throws NumberFormatException, IOException {
int T=10;
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("res/1223_input.txt")));
for(int tc = 1; tc <= T; tc++)
{
n = Integer.parseInt(br.readLine());
Stack<Character>st = new Stack<>();
String str = br.readLine();
String nstr = "";
for(int i=0; i<n; i++) {
char c = str.charAt(i);
if(c=='*'|| c=='/'||c=='+'||c=='-') {
if(st.isEmpty()) {
st.push(c);
continue;
}
if(c=='*'||c=='/') {
while(true) {
if(st.isEmpty()) {break;}
char nc = st.peek();
if(nc=='*'||nc=='/') {
nstr+=st.pop();
}
else {
break;
}
}
st.push(c);
}
else {
while(true) {
if(st.isEmpty()) {break;}
nstr+=st.pop();
}
st.push(c);
}
}
else {
nstr+=c;
}
}
while(!st.isEmpty()) {
nstr+=st.pop();
}
int a =0;
int b =0;
Stack<Integer>nst = new Stack<>();
for(int i=0; i<n; i++) {
char c = nstr.charAt(i);
if(c=='*'|| c=='/'||c=='+'||c=='-') {
a = nst.pop();
b = nst.pop();
if(c=='*'){
nst.push(a*b);
}
else if(c=='/') {
nst.push(a/b);
}
else if(c=='+') {
nst.push(a+b);
}
else {
nst.push(a-b);
}
}
else {
nst.add(c-'0');
}
}
System.out.println("#"+tc+" "+nst.pop());
}
}
}
'swea' 카테고리의 다른 글
파핑파핑지뢰찾기 (0) | 2021.10.02 |
---|---|
3307. 최장증가부분수열 (LIS) (0) | 2021.09.16 |
4012.요리사 (0) | 2021.08.22 |
정올- 1828.냉장고 (0) | 2021.08.22 |
6808번. 규영이와인영이의카드게임 (0) | 2021.08.15 |