[자료구조] 수식의 계산

2023. 5. 10. 23:43·전공/자료구조
728x90
반응형

수식

- 피연산자, 연산자, 분리자로 구성

- 수식의 의미를 이해하기 위해 연산의 수행 순서를 파악해야 함

- 계산 순서를 고정하기 위해 각 연산자에 우선순위를 지정해야 함

C++의 연산자 우선순위

식의 표현

- 중위 표기식: A * B / C

- 후위 표기식: A B * C /

- 전위 표기식: / * A B C

 

후위표기식

- 괄호가 불필요

- 연산자 우선순위 불필요

- 계산 과정이 간단(왼쪽에서 오른쪽)

 

중위 표기에서 후위표기 변환 알고리즘

  1. 식을 전부 괄호로 묶음
  2. 이항 연산자들을 모두 자기 오른쪽 괄호로 이동
  3. 괄호를 전부 삭제

 

더보기

예시)

  1. A/B-C+D*E-A*C
  2. ((((A/B)-C)+(D*E))-(A*C))
  3. AB/C-DE*+AC*-

이때 피연산자의 순서는 불변

 

A+B*C → ABC*+

다음 토큰 스택 출력
없음 공백 없음
A 공백 A
+ + A
B + AB
* +* AB
C +* ABC
완료 공백 ABC*+

 

A*(B+C)*D → ABC+*D*

다음 토큰 스택 출력
없음 공백 없음
A 공백 A
* * A
( *( A
B *( AB
+ *(+ AB
C *(+ ABC
) * ABC+
* * ABC+*
D * ABC+*D
완료 공백 ABC+*D*

 

우선순위를 기반으로 스택킹과 언스택킹을 수행

'(' 괄호 때문에 복잡해짐

  • 스택 속에 있을 때는 낮은 우선순위의 연산자처럼 동작
  • 그 외의 경우 높은 우선순위의 연산자처럼 동작

해결 방법

  • isp(in-stack priority), icp(in-coming priority) 사용
  • 연산자는 자신의 isp가 새로운 연산자의 icp보다 산술적으로 작거나 같을 때 스택 밖으로 나옴

 

 

구현

void Postfix(Expression e)
{ // 수식 e를 전달받음
  // 수식 e의 마지막 토큰은 #
    Stack<Token> stack; // 스택 생성
    stack.Push('#');    // 스택의 시작은 #
    for (Token x = NextToken(e); x != '#'; x = NextToken(e))
        if (isdigit(x) || isalpha(x))
        // if 괄호 안쪽은 x가 피연산자(숫자, 알파벳)라면 true, 아니면 false
            cout << x;
        else if (x == ')')
        { // '(' 전까지 스택 배출
            for (; stack.Top() != '('; stack.Pop())
                cout << stack.Top();
            stack.Pop(); // '(' 배출
        }
        else
        { // x는 연산자, 연산자 우선순위를 비교해서 배출
            for (; isp(stack.Top()) <= icp(x); stack.Pop())
                cout << stack.Top();
            stack.Push(x);
        }
        
    // 스택의 남은 부분 전부 배출
    for (; !stack.IsEmpty(); cout << stack.Top(), stack.Pop())
        ;
    cout << endl;
}

 

시간복잡도 - Θ(n)

728x90
반응형

'전공 > 자료구조' 카테고리의 다른 글

[자료구조] 연결 리스트 2 (체인 반복자, 체인 조작 연산 2)  (0) 2023.05.11
[자료구조] 연결 리스트 1 (개념, 체인 구현, 체인 조작 연산 1)  (0) 2023.05.11
[자료구조] 미로 문제  (1) 2023.05.10
[자료구조] 템플릿 함수, 컨테이너 클래스(Bag), C++의 서브타입과 상속  (0) 2023.05.10
[자료구조] 큐  (2) 2023.05.10
'전공/자료구조' 카테고리의 다른 글
  • [자료구조] 연결 리스트 2 (체인 반복자, 체인 조작 연산 2)
  • [자료구조] 연결 리스트 1 (개념, 체인 구현, 체인 조작 연산 1)
  • [자료구조] 미로 문제
  • [자료구조] 템플릿 함수, 컨테이너 클래스(Bag), C++의 서브타입과 상속
dev_ares
dev_ares
대학에서 컴퓨터공학을 전공하고 있는 학생입니다.
    반응형
    250x250
  • dev_ares
    노트
    dev_ares
  • 전체
    오늘
    어제
    • 분류 전체보기 (187)
      • IT 트랜드 (2)
      • 백엔드 (18)
        • Java + Spring (8)
        • Kotlin + Spring (5)
        • 백엔드 (5)
      • 프론트엔드 (1)
        • React (1)
      • 대외활동 (17)
        • 42서울 (17)
      • 백준 (6)
        • Java (2)
        • C++ (3)
      • 전공 (121)
        • 객체지향프로그래밍 (17)
        • 자료구조 (23)
        • 리눅스시스템관리 (16)
        • 컴퓨터구조 (25)
        • 네트워크 (25)
        • 데이터베이스 (15)
        • 기타 전공 (0)
      • 프로그래밍 언어 (18)
        • Java (5)
        • Swift (4)
        • C++ (1)
        • Kotlin (8)
      • 기타 (4)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    자료구조
    단일 사이클
    추가 문제
    데이터패스
    메모리 계층 구조
    자바
    C++
    코틀린
    컴공 포트폴리오
    컴퓨터 구조 및 설계
    사설 문제
    오블완
    티스토리챌린지
    명령어
    백준
    리눅스
    반복자
    상속
    컴퓨터구조
    42서울
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
dev_ares
[자료구조] 수식의 계산
상단으로

티스토리툴바