순차 자료구조인 1차원 배열을 이용해 스택을 구현할 수 있다. 1차원 배열인 stack[n]을 사용할 때 n은 배열 크기로, 배열 원소의 개수를 나타내므로 n은 스택 크기가 된다. 스택에 원소가 쌓이는 순서는 배열의 인덱스로 표현한다. 따라서 스택의 첫 번째 원소는 stack[0]에 저장하고, 스택의 두 번쨰 원소는 stack[1]에 저장하며, 스택의 n번째 원소는 stack[n-1]에 저장한다.
스택의 top을 표현하기 위해 배열 stack의 마지막 원소의 인덱스르 변수 top에 저장한다. 변수 top에 0부터 (n-1)까지 인덱스를 저장하게 되므로 스택의 초기 상태(공백 스택)에서는 -1을 저장한다.
크기가 5인 스택을 생성하여 원소 A, B, C를 순서대로 삽입한 후에 원소 하나를 삭제하는 과정을 살펴보자.
[ 예제 5-1 ] 은 순차 자료구조를 이용하여 스택의 추상 자료형과 알고리즘을 구체화하여 구현한 프로그램이다.
// 예제 5-1 순차 자료구조를 이용해 순차 스택 구현하기
#include <stdio.h>
#include <stdlib.h>
#define STACK_SIZE 100
typedef int element; // 스택 원소(element)의 자료형을 int로 정의
element stack[STACK_SIZE]; // 1차원 배열 스택 선언
int top = -1;
// 스택이 공백 상태인지 확인하는 연산
int isEmpty() {
if (top == -1) return 1;
else return 0;
}
// 스택이 포화 상태인지 확인하는 연산
int isFull() {
if (top == STACK_SIZE - 1) return 1;
else return 0;
}
// 스택의 top에 원소를 삽입하는 연산
void push(element item) {
if (isFull()) {
printf("\\n\\n Stack is FULL! \\n");
return;
}
else stack[++top] = item;
}
// 스택의 top에서 원소를 삭제하는 연산
element pop() {
if (isEmpty()) {
printf("\\n\\n Stack is Empty!!\\n");
return 0;
}
else return stack[top--]; // 현재 top의 원소를 삭제한 후 top 감소
}
// 스택의 top 원소를 검색하는 연산
element peek() {
if (isEmpty()) { // 스택이 공백 상태인 경우
printf("\\n\\n Stack is Empty !\\n");
exit(1);
}
else return stack[top]; // 현재 top의 원소 확인
}
void printStack() {
int i;
printf("\\n STACK [ ");
for (i = 0; i < top; i++)
printf("%d ", stack[i]);
printf("] ");
}
void main(void) {
element item;
printf("\\n** 순차 스택 연산 **\\n");
printStack();
push(1); printStack();
push(2); printStack();
push(3); printStack();
item = peek(); printStack();
printf("\\tpeek => %d", item);
item = pop(); printStack();
printf("\\tpop => %d", item);
item = pop(); printStack();
printf("\\tpop => %d", item);
item = pop(); printStack();
printf("\\tpop => %d", item);
getchar();
}
28행 : 스택이 포화 상태가 아닌 경우에 삽입 연산을 수행한다. stack[++top]=item;은 ①++top;과 ②stack[top]=item;을 의미하므로 먼저 현재 top의 위치를 하나 증가시킨 후에 원소 item을 저장한다.
37행: 스택이 공백 상태가 아닌 경우에 삭제 연산을 수행한다. return stack[top—];은 ①return stack[top];과 ②top—;를 의미하므로, 삭제 대상인 현재 top의 원솔르 반환한 후에 top의 위치를 하나 감소시킨다.
46행 : 스택이 공백 상태가 아닌 경우에 검색 연산을 수행한다. 스택에 저장된 원소는 top의 위치에서만 액세스할 수 있으므로, 검색 연산을 통해 top의 원소를 확인한다.
53~54행: 1차원 배열로 구현한 스택에 저장된 원소를 출력하기 위해 배열 원소 stack[0]부터 stack[top] 까지 출력한다. stack[0]은 스택의 첫 번째 원소이고, stack[top]은 스택의 마지막 원소이다.