반응형
스택은 자료구조의 기본이라고 할 수 있다. 스택의 특징은 후입선출(LIFO)이다. 즉, 마지막에 들어간 것이 처음에 나온다고 생각하면 된다. 스택의 말 뜻처럼 쌓는다고 생각하면 편하다.
예를 들어 밑넓이는 좁고 높이가 긴 직육면체의 상자가 있다 생각해보자. 여기에 물건을 넣었을 때 맨 밑의 물건을 꺼내기 위해선 안에 있는 모든 물건을 빼야한다. 스택은 이런 것이다. 자세한 것은 밑의 링크를 참조하면 된다.
https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D
스택을 C로 구현했을 때 코드를 한 번 봐보자.
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 100
typedef int element;
element stack[MAX_STACK_SIZE];
int top = -1;
int is_empty() {
return (top == -1);
}
int is_full() {
return (top == (MAX_STACK_SIZE - 1));
}
void push(element item) {
if (is_full()) {
fprintf(stderr, "스택 포화 에러\n");
return;
}
else stack[++top] = item;
}
element pop() {
if (is_empty()) {
fprintf(stderr, "스택 공백 에러\n");
exit(1);
}
else return stack[top--];
}
int main(void) {
push(1);
push(2);
push(3);
printf("%d\n", pop());
printf("%d\n", pop());
printf("%d\n", pop());
return 0;
}
C는 동적할당이 아닌 이상 스택이라는 담는 상자의 크기를 정해줘야한다. 그리고 top의 초기값을 -1로 하여 비어있다는 상태를 정의한다. main을 실행시키면
위와 같은 결과가 나온다. 먼저 들어간(push)숫자가 가장 밑에 있음을 보여준다.
반면에 파이썬은 어떨까?
class Stack:
def __init__(self):
self.top=[]
def isEmpty(self):return len(self.top) == 0
def size(self): return len(self.top)
def clear(self): self.top=[]
def push(self,item): # 삽입
self.top.append(item)
def pop(self): # 삭제(마지막 부분)
if not self.isEmpty():
return self.top.pop(-1)
def peek(self): # 맨 위의 항목을 반환
if not self.isEmpty():
return self.top[-1]
C에 비해 정의하는 함수의 길이도 짧고 직관적으로 바로 이해할 수 있다.
다음 장에는 stack의 활용 부분으로 C와 Python의 비교를 해보겠다.
반응형
'자료구조' 카테고리의 다른 글
Linked List - C와 Python 비교 - 개념 (1) | 2020.07.15 |
---|---|
queue - 3 (0) | 2020.07.15 |
Queue - C와 Python 비교 - 2 (0) | 2020.07.13 |
Queue - C와 Python 비교 (0) | 2020.07.13 |
Stack - C와 Python 비교(2) (0) | 2020.07.03 |
댓글