스택(Stack)을 이용한 계산기 프로그램


스택(Stack)을 이용한 계산기 프로그램


이번에는 스택(stack)을 이용해서 계산기 프로그램을 만들어 볼것이다.

사용할 함수는 strlen, memset, strcspn, memcpy, atoi 함수를 사용해서 만들어보자.


strlen = 문자열 길이 구하기.

memset = 메모리 채우기

strcspn = 문자열 중에서 일치되는 첫 문자의 위치 구하기

memcpy = 메모리 복사하기

atoi = 문자열을 정수형으로 변형하기


[프로그래밍/C] - memcpy, memmove, memset 함수 구현

[프로그래밍/C] - strcspn 문자열 중에서 일치되는 첫 문자의 위치 구하기

[프로그래밍/C] - strlen 문자열 길이

이 프로그램 함수들은 헤더파일을 include 해서 만든것이 아니라 직접 구현을 해서 만든 프로그램이다.


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
#include <stdio.h>
#define STACK_MAX 100
int push(int value);
int pop(int *value);
size_t strlen(const char *s);
void* memset(void *dest, int fillChar, size_t count);
size_t strcspn(const char *stringconst char *strCharSet);
void* memcpy(void *dest, const void *src, size_t count);
int atoi(const char *string);
typedef struct tagStack
{
    int array[STACK_MAX];
    int top;
    int bottom;
}STACK;
STACK s;
main()
{
    char buff[100], tmp[100];
    char *op = "+-*/%";
    int index;
    int value1 = 0, value2 = 0;
 
    s.top = STACK_MAX;
 
    puts("계산식을 1*2처럼 입력하고 엔터키를 치세요.");
    puts("아무것도 입력하지 않으면 계산이 종료됩니다.");
    while (1) {
        printf("계산식 : ");
        gets_s(buff,sizeof(buff));
        if (strlen(buff) == 0break;
        memset(tmp, 0sizeof(tmp));
        index = strcspn(buff, op);
        memcpy(tmp, buff, index);
        value1 = atoi(tmp);
        value2 = atoi(&buff[index + 1]);
 
        switch (buff[index]) {
        case '+': value1 += value2; break;
        case '-': value1 -= value2; break;
        case '*': value1 *= value2; break;
        case '/': value1 /= value2; break;
        case '%': value1 %= value2; break;
        default: puts("잘못된 연산자를 사용하였습니다."); continue;
        }
        if (push(value1) == -1)
            puts("더 이상 저장할 수 없습니다.");
        printf("%s = %d, s.top = %d \n\n", buff, value1, s.top);
    }
    value1 = 0;
    while (1) {
        if (pop(&value2) == -1)break;
        value1 += value2;
    }
    printf("계산의 총합은 %d입니다.\n", value1);
}
size_t strlen(const char *s)
{
    size_t count = 0;
    while (*s)
        s++, count++;
    return count;
}
void* memset(void *dest, int fillChar, size_t count)
{
    for (size_t i = 0; i < count; i++)
        *((char*)dest + i) = fillChar;
    return dest;
}
size_t strcspn(const char *stringconst char *strCharSet)
{
    const char *temp;
    size_t n = 0;
    while (*string) {
        temp = strCharSet;
        while (*temp) {
            if (*temp == *string)
                return n;
            temp++;
        }
        n++string++;
    }
    return n;
}
void* memcpy(void *dest, const void *src, size_t count)
{
    for (size_t i = 0; i < count; i++)
        *((char*)dest + i) = *((char*)src + i);
    return dest;
}
int atoi(const char *string)
{
    int tot = 0;
    while (*string) {
        tot = tot * 10 + *string - '0';
        string++;
    }
    return tot;
}
int push(int value)
{
    if (s.top == 0return -1;
    s.array[--s.top] = value;
    return 0;
}
int pop(int *value)
{
    if (s.top == STACK_MAX) return -1;
    *value = s.array[s.top++];
    return 0;
}
cs

< 출력 >


먼저 일단 스택에 대해서 알아보자.
스택은 LIFO(Last - In - First - Out) 라고 불리며, 맨 나중에 저장한 데이터가 가장 먼저 나오는 것이다.
모든 프로그램에서 사용되는 지역변수는 내부적으로 스택 알고리즘을 사용하고 있다.

스택 동작 방식은 T는 Top, B는 Bottom이다. push할 때 T는 감소하고 pop할 때 T는 증가한다.


3~4행에서 스택에 데이터를 삽입하는 동작을 push라고 하며, 스택에서 데이터를 꺼내오는 동작을 pop라고 한다. 각 함수들을 선언한다.
5~9행에서 우리가 사용할 함수들을 구현해준 함수들이다.
10행에서 스택에 사용할 구조체를 만들어주고 스택에 최대 크기를 100으로 잡는다.
20행에서 계산식에 사용된 연산자를 검색할 op를 정의한다.
32행에서 tmp배열을 모두 0으로 초기화한다.
33행에서 문자열에서 연산자(+, -, *, /, %)의 위치를 검색한다.
34행에서 검색된 연산자의 전까지 buff 배열을 tmp에 복사를 한다.
35~36행에서 문자열을 정수로 만들어주는 작업을 한다.
46행에서 연산자에 따라 연산을 수행하는데 push 함수가 -1을 반환하면 더 이상 스택에 저장 할 수 없는 상태(overflow)이다.
52행에서 스택에 저장되어 있는 값을 하나씩 꺼내온다. pop 함수가 -1을 반환하면 더 이상 꺼내올 값이 없는(underflow)이다.

스택을 이용해서 계산기를 만들어 보았다.
나중에는 스택을 이용해서 지렁이 게임을 만들고 미로찾기 인공지능 게임도 만들어 볼 것이다.
그리고 스택의 상황을 알 수 있는 프로그램도 만들어 볼 것이다.


댓글

Designed by JB FACTORY