Stack, Queue(자료구조) - 0504. 후위식 연산
private static int solution(String str) {
Stack<Character> stack = new Stack<>();
for(int i=str.length(); i>0; i--) {
char c = str.charAt(i - 1);
if(c - '0' >= 0 && c - '0' <= 9) {
char top = stack.peek();
while(top != '+' && top != '-' && top != '*' && top != '/' && !stack.empty()) {
stack.pop();
if(stack.peek() == '+') c = (char)((c - '0') + (top - '0') + '0');
else if(stack.peek() == '-') c = (char)((c - '0') - (top - '0') + '0');
else if(stack.peek() == '*') c = (char)((c - '0') * (top - '0') + '0');
else if(stack.peek() == '/') c = (char)((c - '0') / (top - '0') + '0');
stack.pop();
if(!stack.empty()) top = stack.peek();
}
}
stack.push(c);
}
return stack.peek() - '0';
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(solution(str));
}
public int solution(String str){
int answer=0;
Stack<Integer> stack = new Stack<>();
for(char x : str.toCharArray()){
if(Character.isDigit(x)){
stack.push(x-48);
}
else{
int rt=stack.pop();
int lt=stack.pop();
if(x=='+') stack.push(lt+rt);
else if(x=='-') stack.push(lt-rt);
else if(x=='*') stack.push(lt*rt);
else if(x=='/') stack.push(lt/rt);
}
}
answer=stack.get(0);
return answer;
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
String str=kb.next();
System.out.println(T.solution(str));
}
해당 문제는 stack
을 이용하여 풀 수 있다. 나의 풀이에서는 수식이 담긴 배열을 뒤부터 접근하였다.
연산자
인 경우 : 스택에 보관피연산자
이며 스택의 상단에 피연산자
가 들어있는 경우피연산자
이며 스택의 상단에 연산자
가 들어있는 경우 : 스택에 보관피연산자
인 경우 : 스택에 보관연산자
인 경우 : 스택에서 2개의 피연산자를 꺼내어 연산 후 결과를 스택에 보관후위식이란 단어에 당연히 뒤에서부터 접근해야한다고 착각하였더니 로직이 더욱 복잡하게 되었다..