[C] 후위표기법 1 Stack_LinkedList
[C] 후위표기법 1 Stack_LinkedList
링크드 리스트의 스택을 활용하여 중위표기법을 후위표기법으로 변경해보자
1. '(' 문자는 무시하고 넘어간다
2. 피연산자는 그대로 출력한다.
3. 연산자는 스택에 푸시한다.
4. ')'를 만나면 스택에서 팝하여 출력한다.
아래 알고리즘의 단점은 연산자 우선 순위가 고려되지 않아 중위표기법에 괄호를 씌워야 한다.
void postfix1(char *dst, char *src){ char c; init_stack(); while (*src){ if (*src == ')'){ *dst++ = pop(); *dst++ = ' '; src++; } else if(*src=='+' || *src=='-' || *src=='*' || *src=='/'){ push(*src); src++; } else if (*src >= '0' && *src <= '9'){ do{ *dst++ = *src++; } while (*src >= '0' && *src <= '9'); *dst++ = ' '; } else{ src++; } } while (head->next != tail){ *dst++ = pop(); *dst++ = ' '; } *dst = 0; } |
아래는 스택과 메인을 포함한 전체 소스코드이다.
#include <stdio.h> #include <malloc.h> typedef struct _node{ int key; struct _node *next; } node; node *head, *tail; void init_stack(void){ head = (node*)malloc(sizeof(node)); tail = (node*)malloc(sizeof(node)); head->next = tail; tail->next = tail; } int push(int k){ node *t; if ((t = (node*)malloc(sizeof(node))) == NULL){ printf("\n Out of memory...."); return -1; } t->key = k; t->next = head->next; head->next = t; return k; } int pop(void){ node *t; int i; if (head->next == tail){ printf("\n Stack underflow"); return -1; } t = head->next; i = t->key; head->next = t->next; free(t); return i; } void clear_stack(void){ node *t, *s; t = head->next; while (t != tail){ s = t; t = t->next; free(s); } head->next = tail; } void print_stack(void){ node *t; t = head->next; printf("\n Stack contents : TOP ------> Bottom \n"); while (t != tail){ printf("%-6d", t->key); t = t->next; } } void postfix1(char *dst, char *src){ char c; init_stack(); while (*src){ if (*src == ')'){ *dst++ = pop(); *dst++ = ' '; src++; } else if(*src=='+' || *src=='-' || *src=='*' || *src=='/'){ push(*src); src++; } else if (*src >= '0' && *src <= '9'){ do{ *dst++ = *src++; } while (*src >= '0' && *src <= '9'); *dst++ = ' '; } else{ src++; } } while (head->next != tail){ *dst++ = pop(); *dst++ = ' '; } *dst = 0; } int main(void){ char infix[20] = "(3*7)+(8/4)-3"; char postfix[20]; postfix1(postfix, infix); printf("%s", postfix); return 0; } |
출처: https://hyeonstorage.tistory.com/347?category=622873 [개발이 하고 싶어요]
'기타 > C언어' 카테고리의 다른 글
[C] Tree 로 전위, 중위, 후위 표기법 출력하기 (0) | 2019.07.26 |
---|---|
[C] Queue 리스트로 구현 (0) | 2019.07.26 |
[C] Queue 배열로 구현 (0) | 2019.07.26 |
[C] 사칙연산 계산 (후위표기법) (0) | 2019.07.26 |
[C] 스택(Stack) LinkedList (0) | 2019.07.26 |
[C] 스택(Stack) 배열형 (0) | 2019.07.26 |
[C] 이중 연결 리스트 (Doubly Linked List) (0) | 2019.07.26 |
[C] 요셉의 문제 (환형 연결 리스트) (0) | 2019.07.26 |