본문 바로가기

프로그래밍/코드분석

[백준1935번] (C) 후위표기식2

(1935)후위표기식

백준 1935번

https://www.acmicpc.net/problem/1935

착안점

  1. double형 스택을 구조체로 선언
  2. +, -, *, /인 경우를 제외하면 피연산자이므로 int형 배열에 있는 원소를 push

테크닉

1938

  1. push(ch-'A')
    • 입력 예제를 보면, ABCDE와 같은 피연산자는 숫자로 변환한 뒤, push해줘야 한다. 피연산자는 항상 A, B, 부터 입력되므로 array 배열에 있는 원소들을 차곡차곡 push하기 위해서는 ch-'A'만큼 빼주어야 한다.
    • 맨 처음에 입력하는 num이 곧 array 배열의 길이기 때문에 AA+A+ 입력된다 할지라도 상관이 없다.

실수했던 점

  1. calculate 함수의 parameter를 double로 선언하지 않았던 점.
  2. 함수(pop, peek)의 return값을 double로 해주지 않았다.

코드

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_SIZE    100

typedef struct Stack{
    int top;
    double s[MAX_SIZE];
}Stack;

void push(Stack *s, double elem){
    s->top++;
    s->s[s->top] = elem;
}

double pop(Stack *s){
    double temp = s->s[s->top];
    s->top--;
    return temp;
}

double peek(Stack *s){
    return s->s[s->top];
}

void calculate(Stack *s, char op, double x, double y){
    switch(op){
        case '+':
            push(s, x+y);
            break;
        case '-':
            push(s, x-y);
            break;
        case '*':
            push(s, x*y);
            break;
        case '/':
            push(s, x/y);
            break;
    }
}

int main(void){
    Stack s;
    s.top = -1;
    char str[100];
    int i=0;
    int num;
    double input;

    scanf("%d", &num);
    double array[num];

    scanf("%s", str);

    for(i=0; i<num; i++){
        scanf("%lf", &input);
    }

    for(i=0; i<strlen(str); i++){
        char ch = str[i];
        switch(ch){
            case '+': case '-': case '*': case '/':
                calculate(&s, ch, pop(&s), pop(&s));
                break;
            default:
                push(&s, array[ch-('A')]);
                break;
        }
    }
    printf("%.2lf", peek(&s));
    printf("\n");
}

추가 설명

1938(1)
ASCII 코드와 Unicode의 이해