[자료구조] 스택 스택의 응용 예제 후위표기 수식의 계산 (2024)

자료구조

[자료구조] 스택 스택의 응용 예제 후위표기 수식의 계산

그리폰 지휘관 2024. 4. 12. 19:07

URL 복사 이웃추가

본문 기타 기능

신고하기

수식의 표기 방법

수식은 연산자와 피연산자, 괄호로 이루어져 있다.

연산자들은 우선순위가 있고 우선순위가 높은 연산자부터 계산하는데 괄호가 가장 우선순위가 높고 이어서 곱셈과 나눗셈, 덧셈과 뺄셈 순으로 계산된다.

수식을 표기하는 방법에는 전위(prefix), 중위(infix), 후위(postfix)의 세 가지 방법이 있다.

연산자가 피연산자 앞에 위치하면 전위, 연산자가 피연산자 사이에 위치하면 중위, 연산자가 피연산자

뒤에 위치하면 후위이다.

사람은 중위 표기법을 사용하지만 컴파일러는 주로 후위 표기법을 사용한다. 그래서 수식을 중위 표기법으로 작성하면 컴파일러는 후위 표기법으로 변환 후 스택을 이용하여 계산한다.

후위 표기 수식 82/3-32*+을 스택을 이용하여 계산하는 과정을 예로 들어보자.

이 후위 표기 수식을 왼쪽에서 오른쪽으로 스캔하면 제일 먼저 8을 만난다.

8은 피연산자이므로 스택에 삽입한다. 다음 글자인 2도 피연산자이므로 마찬가지로 스택에 삽입한다.

다음 글자인 '/'는 나누기 연산자이므로 스택에서 8과 2를 꺼내 나누기 연산을 한 결과인 4를 스택에 삽입한다.

다음 글자 3은 피연산자이므로 스택에 저장하고 '-'는 연산자이므로 스택에서 4와 3을 꺼내 뺄셈 연산을 한 결과인 1을 스택에 저장한다.

이렇게 나머지 연산도 끝까지 진행하면 마지막에 스택에는 7이 남게 되고 7이 이 수식의 결과값이 된다.

후위 표기 수식 알고리즘을 의사 코드로 나타내면 다음과 같다.

위의 알고리즘을 C로 구현해 보자.

아래의 프로그램은 피연산자가 한 문자로 된 숫자라고 가정하였다.

여러 문자로 된 숫자를 처리하려면 입력 문자열을 분석하는 프로그램을 추가로 구현해야 한다.

#include <stdio.h>#include <stdlib.h>#define MAX_STACK_SIZE 100typedef char element;typedef struct {element data[MAX_STACK_SIZE];int top;} StackType;// 스택 초기화 함수void init_stack(StackType* s){s->top = -1;}// 공백 상태 검출 함수int is_empty(StackType* s){return (s->top == -1);}// 포화 상태 검출 함수int is_full(StackType* s){return (s->top == (MAX_STACK_SIZE - 1));}// 삽입함수void push(StackType* s, element item){if (is_full(s)){fprintf(stderr, "스택 포화 에러\n");return;}else s->data[++(s->top)] = item;}// 삭제함수element pop(StackType* s){if (is_empty(s)){fprintf(stderr, "스택 공백 에러\n");exit(1);}else return s->data[(s->top)--];}// 피크함수element peek(StackType* s){if (is_empty(s)){fprintf(stderr, "스택 공백 에러\n");exit(1);}else return s->data[(s->top)];}// 후위표기 수식 계산 함수int eval(char exp[]){int op1, op2, value, i = 0;int len = strlen(exp);char ch;StackType s;init_stack(&s);for (i = 0; i < len; i++){ch = exp[i];if (ch != '+' && ch != '-' && ch != '*' && ch != '/'){value = ch - '0'; // char형으로 입력된 데이터를 int형으로 변환push(&s, value);}else{op2 = pop(&s);op1 = pop(&s);switch (ch){case '+': push(&s, op1 + op2); break;case '-': push(&s, op1 - op2); break;case '*': push(&s, op1 * op2); break;case '/': push(&s, op1 / op2); break;}}}return pop(&s);}int main(){int result;printf("후위표기식은 82/3-32*+\n");result = eval("82/3-32*+");printf("결과값은 %d\n", result);return 0;}

중위 표기 수식 -> 후위 표기 수식 변환

중위 표기 수식을 후위 표기 수식으로 변환하기 위해서 입력받은 수식을 왼쪽에서 오른쪽으로 스캔한다.

피연산자를 만나게 되면 후위 표기 수식에 출력한다.

연산자를 만나게 되면 스택에 잠시 저장한다. 후위 표기 수식에서는 기본적으로 피연산자들 뒤에 연산자가 나오기 때문이다.(적절한 위치를 찾을 때까지 출력을 보류)

예를 들어 a + b라는 수식이 있으면 a는 그대로 출력하고 '+'는 잠시 저장, b는 그대로 출력한다. 최종적으로 저장되었던 '+'를 출력하여 ab+가 된다.

또 다른 예시로 a + b * c에서 a, b, c는 그대로 출력하고 '+'와 '*'는 스택에 잠시 저장한다.

기본적으로 가장 나중에 스캔된 연산자가 가장 먼저 출력되어야 하므로 *연산자가 먼저 출력되고 +연산자가 나중에 출력되어 abc*+가 된다.

하지만 a * b + c의 경우 *가 스택에 들어가 있는 상태에서 +를 스택에 넣으면 안 된다.

또 a - b + c의 경우에도 abc+-로 출력한다면 문제가 발생한다.

따라서 스택에 존재하는 연산자가 현재 처리 중인 연산자보다 우선순위가 높다면 스택에 있는 연산자들 중에서 우선순위가 높은 연산자들을 먼저 출력하고 처리 중인 연산자를 스택에 넣어야 한다.

우선순위가 같은 경우에도 일단 스택 상단의 요소를 꺼내 출력해야 한다.

그렇다면 괄호는 어떻게 처리해야 할까? (a + b) * c를 예로 들어보자.

왼쪽 괄호는 무조건 스택에 삽입한다.

왼쪽 괄호가 스택에 삽입되면 왼쪽 괄호를 우선순위가 가장 낮은 연산자로 취급한다.

그리고 그다음에 만나는 어떠한 연산자도 계속해서 스택에 삽입되고 오른쪽 괄호를 만났을 때 왼쪽 괄호가 스택에서 삭제될 때까지 모든 연산자들을 출력한다.

그렇다면 중위 표기 수식을 후위 표기 수식으로 변환하는 프로그램을 C로 구현해 보자.

#include <stdio.h>#include <stdlib.h>#define MAX_STACK_SIZE 100typedef char element;typedef struct {element data[MAX_STACK_SIZE];int top;} StackType;// 스택 초기화 함수void init_stack(StackType* s){s->top = -1;}// 공백 상태 검출 함수int is_empty(StackType* s){return (s->top == -1);}// 포화 상태 검출 함수int is_full(StackType* s){return (s->top == (MAX_STACK_SIZE - 1));}// 삽입함수void push(StackType* s, element item){if (is_full(s)){fprintf(stderr, "스택 포화 에러\n");return;}else s->data[++(s->top)] = item;}// 삭제함수element pop(StackType* s){if (is_empty(s)){fprintf(stderr, "스택 공백 에러\n");exit(1);}else return s->data[(s->top)--];}// 피크함수element peek(StackType* s){if (is_empty(s)){fprintf(stderr, "스택 공백 에러\n");exit(1);}else return s->data[(s->top)];}// 연산자의 우선순위를 반환int prec(char op){switch (op){case '(': case ')': return 0;case '+': case '-': return 1;case '*': case '/': return 2;}return -1;}// 중위표기 수식 -> 후위표기 수식 변환void infix_to_postfix(char exp[]){int i = 0;char ch, top_op;int len = strlen(exp);StackType s;init_stack(&s);for (i = 0; i < len; i++){ch = exp[i];switch (ch){case '+': case '-': case '*': case '/': // 연산자// 스택에 있는 연산자의 우선순위가 더 크거나 같으면 출력while (!is_empty(&s) && prec(ch) <= prec(peek(&s))){printf("%c", pop(&s));}push(&s, ch);break;case '(': // 왼쪽 괄호push(&s, ch);break;case ')': // 오른쪽 괄호top_op = pop(&s);// 왼쪽 괄호를 만날 때까지 출력while (top_op != '('){printf("%c", top_op);top_op = pop(&s);}break;default: // 피연산자printf("%c", ch);break;}}while (!is_empty(&s)) // 스택에 저장된 연산자들 출력{printf("%c", pop(&s));}}int main(){char* s = "(2+3)*4+9";printf("중위표기 수식 %s \n", s);printf("후위표기 수식 ");infix_to_postfix(s);printf("\n");return 0;}

자료구조 5주차(3)

드디어 자료구조의 기본 구조라고 할 수 있는 스택을 학습했습니다!

스택이라는 구조 자체는 이해하기 쉽지만 이를 배열이나 구조체를 이용하여 구현한다는 게 막 그리 쉽게 와닿지는 않았지만 이렇게 블로그에 정리하면서 공부하다 보니 이해가 잘 되기도 하고 나름 재밌었습니다.

사실 이번 주 6주차에는 큐를 학습했습니다. 이제서야 저번주에 배웠던 스택을 올리는 건데요.. 큐는 내일 올릴 생각입니다.

다다음주가 시험인데 운영체제, HTML, C++도 같이 공부해야 하는데 자료구조에만 너무 시간을 몰빵하는 것 같아 걱정이네요.

댓글1 이 글에 댓글 단 블로거 열고 닫기

인쇄

[자료구조] 스택 스택의 응용 예제 후위표기 수식의 계산 (2024)
Top Articles
Spannungsgesteuerter Oszillator VCO (CD4046 MC14046 CD4093 MC14093 74HC132 TLC271 TLC271 LinCMOS)
Test: Moog Mother-32, semi-modularer Analogsynthesizer - AMAZONA.de
W B Crumel Funeral Home Obituaries
Pulse Point Oxnard
A Qué Hora Cierran Spectrum
Saratoga Hills Single-Family Homes for Sale
Santa Maria Cars Craigslist
Fy23 Ssg Evaluation Board Fully Qualified List
What Is Opm1 Treas 310 Deposit
Stellaris Mid Game
Island Cremations And Funeral Home
Ta Travel Center Las Cruces Photos
How to find cash from balance sheet?
Bleach Tybw Part 2 Gogoanime
The Perfect Couple Episode 5 Cast & Characters - Eve Hewson, Nicole Kidman & More (Photos)
Cox Teacher Discount
Sodexo Northern Portal
Cellmapper Verizon
Post Crescent Obituary
WhirlyBall: next-level bumper cars
How Much Does Costco Gas Cost Today? Snapshot of Prices Across the U.S. | CostContessa
Aogf Causes.benevity
Fort Worth Star-Telegram from Fort Worth, Texas
Razwan Ali ⇒ Free Company Director Check
Account Now Login In
Cardaras Logan Ohio
Greet In Cheshire Crossword Clue
My Fico Forums
Square Coffee Table Walmart
Roxplayhouse
Pervmom Noodle
Reely Hooked Fish Dip Amazon
209-929-1099
Bank Of America Operating Hours Today
Family Naturist Contest
Weather Tomorrow Hourly At My Location On Netflix Movies
Craigslist Lake Charles
https://www.hulu.com/series/amish-haunting-96e9c592-7006-47d6-bb8f-265e9ef174ec
Ourfig
Bianca Censo
Ew41.Ultipro
Ice Quartz Osrs
Saw X Showtimes Near Stone Theatres Sun Valley 14 Cinemas
Sam's Club Gas Price Mechanicsburg Pa
4225 Eckersley Way Roseville Ca
Fcs Punting Stats
Molly Leach from Molly’s Artistry Demonstrates Amazing Rings in Acryli
Experity Installer
Craigslist Lasalle County Il
Carros Jeep Wrangler Tachira | MercadoLibre 📦
Bme Flowchart Psu
Latest Posts
Article information

Author: Patricia Veum II

Last Updated:

Views: 6433

Rating: 4.3 / 5 (44 voted)

Reviews: 91% of readers found this page helpful

Author information

Name: Patricia Veum II

Birthday: 1994-12-16

Address: 2064 Little Summit, Goldieton, MS 97651-0862

Phone: +6873952696715

Job: Principal Officer

Hobby: Rafting, Cabaret, Candle making, Jigsaw puzzles, Inline skating, Magic, Graffiti

Introduction: My name is Patricia Veum II, I am a vast, combative, smiling, famous, inexpensive, zealous, sparkling person who loves writing and wants to share my knowledge and understanding with you.