c·c++/c 프로그래밍

infix to prefix

바로이순간 2014. 5. 12. 20:38

#include <stdio.h>

#include <stdlib.h>

// 연산자 우선순위을 구하는 함수

// 곱셈과 나눗셈의 우선순위가 덧셈이나 뺄셈보다 더 높다.

int precedence(int op) {

    if(op=='(') return 0;

    if(op=='+'||op=='-') return 1;

    if(op=='*'||op=='/') return 2;

    return 3;

}

// 연산자 이외에는 괄호, 피연산자(숫자, 문자), 숫자, 문자 만 나오므로

// 숫자, 문자인지를 구하는 함수를 사용하면 된다.

int isnumber(int k) {

    if('a'<=k && k<='z') {

        return 1;

    }

    if('A'<=k && k<='Z') {

        return 1;

    }

    if('0'<=k && k<='9') {

        return 1;

    }

    return 0;

}

// 스택을 초기화 하는 것은 아주 간단하다.

// 스택의 top을 나타내는 0번째 원소에 0을 넣어 주기만 하면 된다.

void initstack(int s[]) {

    s[0]=0;

}

// push는 스택의 주소와 값을 인자로 가진다.

// 스택의 크기를 50으로 잡았으므로 49가 되면 full이 된다.

// top을 위한 공간을 한개 필요로 하므로, 실제로 스택을 위한 공간은

// 1이 줄어 들게 된다.

// 처음 스택에 push를 하는 경우를 생각해 보면 스택의 1번째 방에

// 값이 들어가야 한다는 것을 알수 있다.

// 따라서 먼저 스택의 0번째 원소를 증가시키고

// 스택의 top이 가리키는 장소에 값을 넣으면 된다.

void push(int s[], int v) {

    if(s[0]<49) s[++s[0]]=v;

    else {

        printf("스택이 꽉 찼습니다.");

        exit(1);

    }

}

// pop은 스택의 주소만 인자로 가진다.

// 스택의 top이 가리키는 방의 값이 반환된다.

// 그리고 스택의 top이 1이 줄게 된다.

// 스택의 top은 스택에 들어있는 원소의 갯수와도 같다.

int pop(int s[]) {

    if(s[0]>0) return s[s[0]--];

    printf("스택이 비었습니다.");

    exit(1);

}

// top 은 스택의 top이 가리키는 값을 반환한다.

int top(int s[]) {

    if(s[0]>0) return s[s[0]];

    printf("스택이 비었습니다.");

    exit(1);

}

// 스택이 empty인지는 top이 0인지를 검사하면 된다.

int isempty(int s[]) {

    return s[0]==0;

}

int main() {

    char infix[100];

    char prefix[100];

    // 스택의 top 을 가리키는 변수는 stack[0] 입니다.

    int stack[50]={0,};

    int stack1[50]={0,};

    int i, x, y;


    printf("중위 표기법: ");

    fflush(stdin);

    gets(infix);

    i=0;

    while(infix[i]!=0) {

        i+=1;

    }

    // 중위 표기를 뒤집어 준다.

    // revert infix notation;

    x=i;

    for(i=0;i<x/2;i+=1) {

        y=infix[i];

        infix[i]=infix[x-i-1];

        infix[x-i-1]=y;

    }

    // 왼괄호와 오른 괄호를 서로 바꾸어 준다.

    for(i=0;i<x;i+=1) {

        if(infix[i]=='(') {

            infix[i]=')';

        } else if(infix[i]==')') {

            infix[i]='(';

        }

    }

        

    i=0;

    while((x=infix[i])>0) {

        // 빈칸은 무시한다.

        if(x==' ') {

            

        // 왼괄호는 push한다.

        } else if(x=='(') {

            push(stack,x);

        // 오른괄호를 만나면 왼괄호까지를 모두 pop하면서 출력한다.[스택1에 push한다.]

        } else if(x==')') {

            while((y=pop(stack))!='(') {

                push(stack1, y);

            }

        // 숫자이면 출력한다. [스택1에 push한다.]

        } else if(isnumber(x)) {

          push(stack1, x);

        // 연산자이다. 

        // 스택의 연산자의 우선순위가 

        // 현재 연산자의 우선순위보다 같거나 높은 경우에는 

        // 모두 pop하여 출력한다.[스택1에 push한다.]

        // 그다음 push한다.

        } else { 

            while(!isempty(stack)&&precedence(top(stack))>=precedence(x)) {

                y=pop(stack);

                push(stack1, y);

            }

            push(stack, x);

        }

        i=i+1;

    }

    // 스택에 남아있는 연산자를 모두 pop하며 출력한다. [스택1에 push한다.]

    while(!isempty(stack)) {

        y=pop(stack);

        push(stack1, y);

    }

    // 스택1에 있는 원소들을 모두 pop하면서 출력한다.

    printf("\n전위 표기법: ");

    while(!isempty(stack1)) {

        y=pop(stack1);

        printf("%c ", y);

    }

    printf("\n");


    return 0;

}

'c·c++ > c 프로그래밍' 카테고리의 다른 글

pseudo random number generator  (0) 2014.06.20
c소스 정리(이쁘게 만들기)  (0) 2014.05.25
부동소수점 판정  (0) 2014.05.11
컴퓨터공학 c언어공부 미리선행 해야되나요??   (0) 2014.04.12
숫자 마름모  (0) 2014.04.02