스택을 구현하기 위해 배열을 사용할 경우, 일차원 배열 stack[MAX_STACK_SIZE] 를 사용한다. 스택의 변수 top은 가장 최근에 삽입된 요소를 가리키는 변수로, 초기값을 -1로 세팅한다(공백 스택을 의미)
스택에서 가장 먼저 삽입된 요소는 stack[0]에, 가장 최근에 삽입된 요소는 stack[top]에 저장된다 (스택의 개념)
[c코드로 스택 구현]
#include <stdio.h>
#define MAX_STACK_SIZE 100
typedef struct {
int stack[MAX_STACK_SIZE];
int top;
} Stack;
// 스택 초기화
void initializeStack(Stack *s) {
s->top = -1; // 초기값으로 -1을 설정하여 공백 스택을 나타냄
}
// 스택이 비어 있는지 확인
int isEmpty(Stack *s) {
return s->top == -1;
}
// 스택이 가득 차 있는지 확인
int isFull(Stack *s) {
return s->top == MAX_STACK_SIZE - 1;
}
// 스택에 요소 추가 (push)
void push(Stack *s, int data) {
if (isFull(s)) {
printf("스택이 가득 찼습니다. 더 이상 요소를 추가할 수 없습니다.\n");
return;
}
s->top++;
s->stack[s->top] = data;
}
// 스택에서 요소 제거 (pop)
int pop(Stack *s) {
int data;
if (isEmpty(s)) {
printf("스택이 비어 있습니다. 더 이상 요소를 제거할 수 없습니다.\n");
return -1; // 임의의 값 반환. 스택이 비어있으면 유효한 값이 없음
}
data = s->stack[s->top];
s->top--;
return data;
}
// 스택의 최상위 요소 확인 (peek)
int peek(Stack *s) {
if (isEmpty(s)) {
printf("스택이 비어 있습니다. 최상위 요소를 확인할 수 없습니다.\n");
return -1; // 임의의 값 반환. 스택이 비어있으면 유효한 값이 없음
}
return s->stack[s->top];
}
int main() {
Stack myStack;
initializeStack(&myStack);
push(&myStack, 10);
push(&myStack, 20);
push(&myStack, 30);
printf("Top element: %d\n", peek(&myStack));
printf("Pop element: %d\n", pop(&myStack));
printf("Pop element: %d\n", pop(&myStack));
printf("Pop element: %d\n", pop(&myStack));
printf("Is the stack empty? %s\n", isEmpty(&myStack) ? "Yes" : "No");
return 0;
}
'Computer Science' 카테고리의 다른 글
[자료구조] 큐 구현: 배열 이용방법(feat. enqueue, dequeue, peek 알고리즘), queue가 가지는 한계점 (0) | 2024.02.05 |
---|---|
[자료구조] 스택 구현 : 연결리스트 이용 방법 (0) | 2024.02.04 |
[자료구조] Doubly Linked List의 삭제 (0) | 2024.02.02 |
[데이터베이스] Natural Join의 위험성에 관하여(Natural Join은 왜 위험할까?) (0) | 2024.02.02 |
[자료구조] Doubly Linked List의 삽입(중간노드, 첫번째 노드, 마지막노드로 삽입) (0) | 2024.02.01 |