더북(TheBook)

간단한 계산기를 구현하는 프로그램에서 stack 컨테이너의 연산들을 연습해보자. 프로그램은 덧셈, 뺄셈, 곱셈, 나눗셈, 거듭제곱과 같은 기본 기능을 제공한다. 이에 해당하는 연산자는 +, -, *, /, ^이다. 거듭제곱은 cmath 헤더에 정의된 pow() 함수로 구한다. 계산식은 공백을 포함해 한 줄짜리 문자열로 읽어온다. remove() 알고리즘으로 입력 수식의 공백을 제거한 뒤에 문자열을 분석하고 그에 따른 수식을 실행한다.

연산자 우선순위를 표현하는 값을 돌려주는 함수를 정의해보자.

inline size_t precedence(const char op)
{
  if (op == '+' || op == '-')
    return 1;
  if (op == '*' || op == '/')
    return 2;
  if (op == '^')
    return 3;
  throw std::runtime_error {string{"invalid operator: "} + op};
}

+와 -는 가장 낮은 우선순위이고, */는 그다음으로 높고, ^이 가장 높은 우선순위다. 연산자 우선순위가 둘 이상의 연산자로 된 식에서 실행 순서를 결정한다. 인수가 지원하는 연산자가 아니라면 runtime_error 익셉션 객체를 던진다. 익셉션 객체의 생성자에 쓰인 string 인수는 catch 블록에서 what()을 호출해서 가져올 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.