리그캣의 개발놀이터

자료구조 - 수식과 STACK 사용(C언어) 본문

프로그래밍 기본/자료구조

자료구조 - 수식과 STACK 사용(C언어)

리그캣 2018. 1. 21. 16:48

수식과 STACK사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef char element;            //char를 스택 element의 자료형으로 정의
 
typedef struct stackNode{        //스택의 노드 구조 정의
    element data;
    struct stackNode *link;
}stackNode;
 
stackNode *top;            //스택의 top노드를 지정하기 위한 포인터 top 선언
 
void push(element item)        //스택 삽입 연산
{
    stackNode *temp=(stackNode *)malloc(sizeof(stackNode));
    temp->data=item;
    temp->link=top;
    top=temp;
}
 
element pop()            //스택의 삭제 후 반환 연산
{
    element item;
    stackNode *temp=top;
 
    if(top == NULL){            //현재 스택이 공백 리스트인 경우
        printf("\n\n Stack is empty !\n");
        return 0;
    }
    else {                        //현재 스택이 공백리스트가 아닌경우
        item = temp->data;
        top=temp->link;
        free(temp);
        return item;
    }
}
 
element peek()        //스택의 top 원소 검색 연산
{
    element item;
    if(top==NULL){            //현재 스택이 공백리스트인 경우
        printf("\n\n Stack is empty!\n");
        return 0;
    }
    else{                //현재 스택이 공백 리스트가 아닌경우
        item = top->data;
        return item;
    }
}
void del()                //스택의 삭제 연산
{
    stackNode *temp;
    if(top==NULL){            //현재 스택이 공백 리스트인 경우
        printf("\n\n Stack is empty !\n");
    }
    else {                    //현재 스택이 공백 리스트가 아닌경우
        temp = top;
        top=top->link;
        free(temp);
    }
}
void printStack()            //스택의 내용 출력 연산
{
    stackNode *= top;
    printf("\n STACK [ ");
    while(p){
        printf("%d ",p->data);
        p=p->link;
    }
    printf("]");
}
 
int testPair(char *exp)            //수식의 괄호를 검사하는 연산
{
    char symbol, open_pair;
    int i, length=strlen(exp);
    top=NULL;
 
    for(i=0;i<length;i++)
    {
        symbol=exp[i];
        switch(symbol){
        case '(' :
        case '[' :
        case '{' :
            push(symbol); break;
        case ')' : 
        case ']' :
        case '}' :
            if(top==NULLreturn 0;
            else{
                open_pair = pop();
                if((open_pair=='('&&symbol != ')')||
                    (open_pair=='['&&symbol != ')')||
                    (open_pair=='{'&&symbol != ')'))
                    return 0;
                else break;
            }
        }
    }
    if(top==NULLreturn 1;
    else return 0;
}
void main(void)
{
    char *express = "{(A+B)-3}*5+[{cos(x+y)+7}-1]*4";
    printf("%s",express);
    if(testPair(express)==1)
        printf("\n\n 수식의 괄호가 맞게 사용되었습니다!");
    else
        printf("\n\n 수식의 괄호가 틀렸습니다!");
 
    getchar();
}
cs


Comments