Page 136 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 136

그림 4-4는 푸시 작업을 그림으로 나타낸 것입니다.

                      여기서 ‘스택 포인터’ ptr은 포인터 변수를 의미하지 않으며 새로운 데이터를 삽입할 인덱스를 기억하는 용도로 사용하는
                   변수로, ‘스택의 인덱스를 가리킨다’는 의미로 ‘스택 포인터’라고 합니다.




                   max   8              Push(&s, 24);  max  8
                   ptr   4                            ptr  5
                   stk                                stk
                            0  19                              0  19
                            1  22           24를 푸시             1  22
                            2  37                              2  37
                            3  53                              3  53
                            ❹                                  4  24
                            5                                  ❺      푸시된 데이터
                            6                                  6
                            7                                  7

                                          [그림 4-4] 스택에 푸시


                   IntStack.c에서 제공하는 함수만 사용하여 스택 작업을 수행하면 스택 포인터 ptr 값은 반드
                   시 0 이상 max 이하가 됩니다. 따라서 아래처럼 스택이 가득 찼는지에 대한 검사는 관계 연산
                   자(>=)가 아니라 등가 연산자(==)를 사용해도 됩니다.


                     if(s->ptr == s->max)



                   하지만 프로그램의 오류, 사용자의 의도적인 잘못된 값 입력 등의 이유로 ptr 값이 잘못 입력
                   되면 max를 초과할 수 있습니다. 따라서 실습 4-2의 프로그램처럼 부등호를 붙여 검사하면

                   스택 크기의 최댓값과 최솟값을 넘는 잘못된 액세스를 막을 수 있습니다. 간단한 코드 수정이
                   지만 이런 방법을 사용하면 프로그램의 안정성을 높일 수 있습니다.


                   팝 함수 Pop

                   Pop 함수는 스택의 꼭대기에서 데이터를 제거하는 함수입니다. 팝에 성공할 경우에는 0을
                   반환하고 스택이 비어 있어 팝을 할 수 없는 경우에는 –1을 반환합니다. 그림 4-5는 팝 작업
                   과정의 한 예입니다. 먼저 스택 포인터 ptr의 값을 감소시키고 stk[ptr]에 저장된 값을 포인터

                   x가 가리키는 변수에 저장합니다.

                      스택이 비어 있는지에 대한 검사는 ptr == 0이 아니라 ptr <= 0으로 판단합니다. 이유는 Push 함수와 같습니다.









                   136   C 알고리즘
   131   132   133   134   135   136   137   138   139   140   141