일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 수광 소자
- C언어
- list
- Stack
- priority_queue
- map
- directx
- Algorithm
- 자료구조
- c++
- arduino compiler
- vector
- 시스템프로그래밍
- Visual Micro
- 아두이노
- stl
- queue
- WinAPI
- Array
- 라인트레이서
- html
- set
- 통계학
- 아두이노 소스
- LineTracer
- Deque
- Arduino
- 컴퓨터 그래픽스
- 아두이노 컴파일러
- 운영체제
- Today
- Total
Kim's Programming
[C로 만드는 자료구조]스택(Stack) - 배열 본문
스택(Stack)
이번에는 자료구조중 스택(Stack)을 알아보겠습니다.
스택이라는 것은 Stack이라는 단어의 사전적 의미에서도 볼 수 있고 위의 그림에서 볼 수 도 있듯이 쌓아놓은 더미를 뜻합니다.
스택(Stack)의 특징
스택은 후입선출(LIFO)의 특징을 가지고 있습니다. LIFO란 Last-In-First-Out으로 가장 나중에 들어온것이 가장 먼져 나간다는 것을 의미합니다. 말그대로 상자를 쌓아뒀다가 제일 밑에 것을 빼내고 싶으면 위에 것들을 다 치운다음 제일 밑에 것을 움직 일 수 있는 것과 같다고 생각하면 됩니다.
스택(Stack)의 구조
스텍은 후입선출의 구조를 가지므로 입구가 하나라고 생각할 수 있습니다. 구조는 다음과 같이 볼 수 있습니다. 스택의 가장 위쪽인(가장 나중에 들어온 자료) top, 스택의 가장 아래인(가장 먼저 들어온 자료) bottom으로 이루어 져 있습니다.
스택(Stack)의 연산
스택의 연산은 크게는 2가지로 볼 수 있습니다.
- push() : 스택에서 데이터를 추가하는 연산
- pop() : 스택에서 제일위에 있는 데이터를 삭제하는 연산
위의 그림에서 볼 수 있듯이 선입 후입선출의 구조를 따라 움직이는 것과 2 연산의 기능을 그림으로 확인할 수 있습니다.
- 에디터등에서 되돌리기(undo) 기능 구현시
- 함수호출에서 복귀주소 기억시 (메모리 stack 영역)
스택은 다음과 같은 구조체들을 이용하여 구현하게됩니다.(배열)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include<cstdio> #define MAX_STACK_SIZE 100 typedef int element; struct Stack_element { element data; }; struct STACK { int top = -1; // 현재 배열에 들어간 인덱스 숫자 Stack_element Array[MAX_STACK_SIZE]; }; | cs |
top이라는 변수를 이용하여 이 스택이 어디까지 데이터가 들어가있는지 확인하는 기준으로 삼습니다. top 변수의 숫자는 데이터가 마지막에 들어있는 배열의 인덱스 숫자와 같습니다. 그리고 구현시에 배열의 0번지를 bottom으로 생각하였으면 배열의 뒤쪽으로 차례 차례 데이터가 들어온다고 생각하여 만들었습니다.
ADT (배열)
- Push()12345void PUSH(STACK *S, element item){S->top += 1;S->Array[S->top].data = item;}
cs 데이터를 밀어 넣는 함수입니다.
POP()
123456element POP(STACK *S){element temp = S->Array[S->top].data;S->top -= 1;return temp;}cs 데이터를 빼내는 함수입니다. 후입선출(LIFO)방식이기 때문에 제일 뒤에 있는 데이터를 처음 빼줍니다.
Peek()
1234element PEEK(STACK *S){return S->Array[S->top].data;}cs 현재 제일 마지막 (제일 위)에 있는 데이터가 무엇인지 확인하는 ADT입니다.
empty() & full()
1234567891011121314void Is_Empty(STACK *S){if (S->top == -1)printf("Stack is empty\n");elseprintf("not empty\n");}void Is_FULL(STACK *S){if (S->top == MAX_STACK_SIZE)printf("Stack is FULL\n");elseprintf("Stack is not FULL\n");}cs 비어있는지 꽉 찼는지 확인하는 함수 들입니다.
이렇게 배열로 만든 스텍을 알아보았습니다. 다음 포스팅에서는 동적할당을 이용한 스택을 구현해 보겠습니다.
'Programming > Data Structure' 카테고리의 다른 글
[C로 만드는 자료구조]큐(Queue) - 배열 (3) | 2015.12.16 |
---|---|
[C로 만드는 자료구조]스택(Stack) - 동적할당 (0) | 2015.12.13 |
[C로 만드는 자료구조]리스트(List)- 이중 원형 연결 리스트 (0) | 2015.11.07 |
[C로 만드는 자료구조]리스트(List)- 단순 원형 연결 리스트 (1) | 2015.11.07 |
[C로 만드는 자료구조]리스트(List) - 단순 연결 리스트(2/2) (2) | 2015.11.06 |