[C++] 백준/Gold/1918. 후위 표기식

2025. 1. 15. 21:45·C++/Algorithm

문제: 후위 표기식(백준 1918번)

문제 분석

이 문제는 주어진 중위 표기식을 스택을 사용하여 후위 표기식으로 변환하는 문제다.
후위 표기식은 연산자를 나중에 쓰는 표기법으로, 계산 순서를 명확히 나타낼 수 있다는 장점이 있다.

후위 표기식

  • 중위 표기식은 연산자가 피연산자 사이에 위치한다.
    예: A + B
  • 후위 표기식은 연산자가 피연산자 뒤에 위치한다.
    예: AB+

후위 표기식의 특징은 괄호 없이도 연산 우선순위를 명확히 알 수 있다는 점이다.
예를 들어, A + B * C를 후위 표기식으로 바꾸면 ABC*+가 된다.

알고리즘

  1. 피연산자는 바로 출력한다.
    (문자열에서 알파벳이 나오면 바로 cout으로 출력)
  2. 연산자는 스택에 넣는다.
    단, 스택에 있는 연산자와 우선순위를 비교해,
    스택의 연산자가 현재 연산자보다 우선순위가 높거나 같으면 꺼내서 출력한 뒤, 현재 연산자를 스택에 넣는다.
  3. 여는 괄호 '('는 스택에 넣는다.
  4. 닫는 괄호 ')'가 나오면, 여는 괄호가 나올 때까지 스택에서 연산자를 꺼내 출력한다.
  5. 문자열 처리가 끝난 후에도 스택에 남아 있는 연산자를 모두 출력한다.

코드

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    string s; cin >> s;
    stack<char> oper;
    unordered_map<char, int> priority = { {'+', 0}, {'-', 0}, {'*', 1}, {'/', 1} };

    for (int i = 0; i < s.size(); i++) {
        char ch = s[i];
        if (ch >= 'A' && ch <= 'Z') { // 피연산자
            cout << ch;
        }
        else if (ch == '(') { // 여는 괄호
            oper.push(ch);
        }
        else if (ch == ')') { // 닫는 괄호
            while (!oper.empty() && oper.top() != '(') {
                cout << oper.top();
                oper.pop();
            }
            oper.pop(); // 여는 괄호 제거
        }
        else { // 연산자
            while (!oper.empty() && oper.top() != '(' && priority[oper.top()] >= priority[ch]) {
                cout << oper.top();
                oper.pop();
            }
            oper.push(ch);
        }
    }

    // 스택에 남아 있는 연산자 출력
    while (!oper.empty()) {
        cout << oper.top();
        oper.pop();
    }
}

 

'C++ > Algorithm' 카테고리의 다른 글

[C++] 백준/Gold/10830. 행렬 제곱  (0) 2025.01.21
[C++] 백준/Silver/1946. 신입 사원  (0) 2025.01.17
[C++] 백준/Gold/16724. 피리 부는 사나이  (1) 2025.01.14
[C++] 백준/Gold/2623. 음악프로그램  (1) 2025.01.13
[C++] 백준/Gold/1202. 보석 도둑  (1) 2025.01.10
'C++/Algorithm' 카테고리의 다른 글
  • [C++] 백준/Gold/10830. 행렬 제곱
  • [C++] 백준/Silver/1946. 신입 사원
  • [C++] 백준/Gold/16724. 피리 부는 사나이
  • [C++] 백준/Gold/2623. 음악프로그램
돼지표
돼지표
https://github.com/wkdgns135
  • 돼지표
    돼지표 개발 스토리
    돼지표
  • 전체
    오늘
    어제
    • 분류 전체보기 (99)
      • C++ (58)
        • Algorithm (52)
      • Python (1)
      • Machine Learning (2)
      • Computer Graphics (4)
        • Curly Hair Simulation (2)
      • GPU Programming (11)
        • CUDA basic (7)
        • CUDA fluidsGL (4)
      • Unreal 5 (20)
        • Troubleshooting (4)
        • FPS Shooting (5)
        • Study (9)
        • EOS (1)
      • Computer Science (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    그래프 탐색
    Fluid Simulation
    FPS
    그리디 알고리즘
    CS
    dp
    unreal 5
    위상 정렬
    Algorithm
    구현
    UE5
    수학
    자료 구조
    Rendering Pipeline
    CUDA
    아이작 맵 생성
    GPU Programming
    BFS
    OpenGL
    C++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
돼지표
[C++] 백준/Gold/1918. 후위 표기식
상단으로

티스토리툴바