본문 바로가기
문제/백준

c++ 백준_1918_"후위 표기식"

by 나 진짜 못차마 2023. 6. 13.
728x90

https://www.acmicpc.net/problem/1918

 

1918번: 후위 표기식

첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 알파벳 대문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의

www.acmicpc.net

 

문제를 보다가

오랜만에

쓰-때압 을 이용한

Infix to Postfix 를 해보았다.

예전에 자료구조 공부할 때 열심히 봐야했던 알고리즘이

Gold3이라니 너무하네

복습하는 식으로 했는데

간만에 보니 좀 헷갈렸다

일단 연산자마다 우선순위를 둬야지

비교하며 stack에서 꺼낼지말지 정한다.

연산자가 [ +, -, *, / ] 일 때

현재 연산자와

stack 내부, top 에 있는 연산자의 우선순위를 비교한다.

(ex. 현재 연산자가 '+'이고 , stack top에 있는 연사자가 '*'라면

stack 내부에 있는 연산자가 우선순위가 더 높기에

pop 및 출력을 해줘야한다.)

모든 비교 및 출력이 끝나면 현재 연산자는 stack 에 넣어준다.

그리고 현재 연산자가

'(' 일 경우

스택에 넣고,

')' 일 경우

먼저 넣은 '(' 가 나오기 전까지

모두 pop 및 출력한다.

연산자가 아닌 숫자(여기서는 알파벳)는

바로바로 출력해준다.

 

#include <iostream>
#include <stack>
#include <string>
using namespace std;

int prec(char op) {
	switch (op){
	case '(':case')': return 0;
	case'+':case'-':return 1;
	case '*':case'/': return 2;
		return -1;
	}	
}

void infix_to_postfix(string exp) {

	int len = exp.size();
	stack<char> st;

	for (int i = 0; i < len; i++) {
		char ch = exp[i];

		switch (ch) {
		case '+':case'-': case'*':case'/':
			while (!st.empty() && (prec(ch) <= prec(st.top()))) {
				cout << st.top();
				st.pop();
			}
			st.push(ch);
			break;
		case '(':
			st.push(ch);
			break;
		case')':
			while (st.top() != '(') {
				cout << st.top();
				st.pop();
			}
			st.pop();
			break;
		default:
			cout << ch;
			break;
		}
	}
	while (!st.empty()) {
		cout << st.top();
		st.pop();
	}
}

int main(void) {

	string exp;

	cin >> exp;

	infix_to_postfix(exp);


}

728x90

'문제 > 백준' 카테고리의 다른 글

c++ 백준_1715_"카드 정렬하기"  (0) 2023.06.15
c++ 백준_1167_"트리의 지름"  (2) 2023.06.13
c++ 백준_1132_"합"  (0) 2023.06.13
c++ 백준_15686_"치킨 배달"  (2) 2023.06.13
c++ 백준_1254_"팰린드롬 만들기"  (0) 2023.06.13