백준 알고리즘/스택

[백준 알고리즘] 1918번 후위표기식 - C

개발로 먹고 살자 2021. 11. 11. 11:18

#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#define MAX_STACK_SIZE 99

typedef struct Stack{
    int top;
    char arr[MAX_STACK_SIZE];
}Stack;

int is_empty(Stack *stack){
        return (stack->top == -1);
}

int is_full(Stack* stack) {
        return (stack->top == (MAX_STACK_SIZE -1));
}


void push(Stack *stack, char c){
        if(is_full(stack)) {
                fprintf(stderr, "스택 포화 에러");
        }

        stack->top++;
        stack->arr[stack->top] = c;
}

char pop(Stack *stack){
        if(is_empty(stack)) {
                fprintf(stderr, "스택 공백 에러");
                exit(1);
        }

        return stack->arr[stack->top--];
}

char value(Stack *stack){
        return stack->arr[stack->top];
}

int operator(char op){
        switch(op) {
                case '(':
                case ')':
                        return 0;
                case '+':
                case '-':
                        return 1;
                case '*':
                case '/':
                        return 2;
                default:
                        return -1;
        }
}

void postfix(char *c) {
        Stack stack;
        stack.top = -1;
        for(int i=0; i<strlen(c); i++){
                if(operator(c[i]) == -1){
                        printf("%c", c[i]);
                }
                else if(c[i]=='('){
                        push(&stack, c[i]);
                }
                else if(c[i]==')'){
                        while(value(&stack) != '('){
                                printf("%c", pop(&stack));
                        }
                pop(&stack);
                }
                else if (operator(c[i]) >=1 ){
                        while(operator(c[i]) <= operator(value(&stack)) && !is_empty(&stack)) {
                                printf("%c", pop(&stack));
                        }
                push(&stack, c[i]);
                }
        }
        while(!is_empty(&stack)){
                printf("%c", pop(&stack));
        }
        printf("\n");
}

int main(void){
    char c[100];
    scanf("%s", c);
    postfix(c);
}