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 알고리즘