[백준 알고리즘] 1918번 후위표기식 - C
#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);
}