diff --git a/pu2rile/README.md b/pu2rile/README.md index 3ef787b..7aff63a 100644 --- a/pu2rile/README.md +++ b/pu2rile/README.md @@ -14,3 +14,4 @@ | 10차시 | 2024.07.11 | 스택 | [화학식량](https://www.acmicpc.net/problem/2257) | [#35](https://github.com/AlgoLeadMe/AlgoLeadMe-10/pull/35#issue-2403173169) | 11차시 | 2024.07.13 | 우선순위 큐 | [강의실](https://www.acmicpc.net/problem/1374) | [#37](https://github.com/AlgoLeadMe/AlgoLeadMe-10/pull/37#issue-2406937336) | 12차시 | 2024.07.23 | 동적 프로그래밍 | [1학년](https://www.acmicpc.net/problem/5557) | [#40](https://github.com/AlgoLeadMe/AlgoLeadMe-10/pull/40) +| 13차시 | 2024.07.26 | 스택 | [후위 표기식](https://www.acmicpc.net/problem/1918) | [#43](https://github.com/AlgoLeadMe/AlgoLeadMe-10/pull/43) \ No newline at end of file diff --git "a/pu2rile/\354\212\244\355\203\235/.DS_Store" "b/pu2rile/\354\212\244\355\203\235/.DS_Store" index efd16c2..9bf3796 100644 Binary files "a/pu2rile/\354\212\244\355\203\235/.DS_Store" and "b/pu2rile/\354\212\244\355\203\235/.DS_Store" differ diff --git "a/pu2rile/\354\212\244\355\203\235/\355\233\204\354\234\204 \355\221\234\352\270\260\354\213\235.c" "b/pu2rile/\354\212\244\355\203\235/\355\233\204\354\234\204 \355\221\234\352\270\260\354\213\235.c" new file mode 100644 index 0000000..ef16d33 --- /dev/null +++ "b/pu2rile/\354\212\244\355\203\235/\355\233\204\354\234\204 \355\221\234\352\270\260\354\213\235.c" @@ -0,0 +1,113 @@ +#include +#include +#include + +#define MAX_STACK_SIZE 100 +#define MAX_TEXT_SIZE 100 // 중위 표기 수식의 최대 길이 + +typedef 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)--]; + } +} + +// 스택의 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(void) { + char s[MAX_TEXT_SIZE]; + scanf("%s", s); + infix_to_postfix(s); + printf("\n"); + return 0; +} diff --git "a/pu2rile/\354\212\244\355\203\235/\355\233\204\354\234\204 \355\221\234\352\270\260\354\213\235.py" "b/pu2rile/\354\212\244\355\203\235/\355\233\204\354\234\204 \355\221\234\352\270\260\354\213\235.py" new file mode 100644 index 0000000..1c8cd4c --- /dev/null +++ "b/pu2rile/\354\212\244\355\203\235/\355\233\204\354\234\204 \355\221\234\352\270\260\354\213\235.py" @@ -0,0 +1,65 @@ +MAX_STACK_SIZE = 100 +MAX_EXPR_SIZE = 100 + +class Stack: + def __init__(self): + self.items = [] + + def is_empty(self): + return not self.items + + def push(self, item): + if len(self.items) >= MAX_STACK_SIZE: + raise OverflowError("스택 포화 에러: 최대 크기 초과") + self.items.append(item) + + def pop(self): + if self.is_empty(): + raise IndexError("스택 공백 에러") + return self.items.pop() + + def peek(self): + if self.is_empty(): + raise IndexError("스택 공백 에러") + return self.items[-1] + +def prec(op): + if op in {'+', '-'}: + return 1 + elif op in {'*', '/'}: + return 2 + else: + return 0 + +def infix_to_postfix(exp): + if len(exp) > MAX_EXPR_SIZE: + raise ValueError("수식 길이 초과 에러: 최대 길이 초과") + + s = Stack() + postfix = [] + for ch in exp: + if ch.isalnum(): # 피연산자 (숫자, 문자 등) + postfix.append(ch) + elif ch == '(': + s.push(ch) + elif ch == ')': + while not s.is_empty() and s.peek() != '(': + postfix.append(s.pop()) + s.pop() # '(' 버림 + else: # 연산자 + while not s.is_empty() and prec(ch) <= prec(s.peek()): + postfix.append(s.pop()) + s.push(ch) + + while not s.is_empty(): # 스택에 남아 있는 모든 연산자를 출력 + postfix.append(s.pop()) + + return ''.join(postfix) + +def main(): + expr = input() + postfix_expr = infix_to_postfix(expr) + print(postfix_expr) + +if __name__ == "__main__": + main() \ No newline at end of file