스택의 개념
-
한 쪽이 막힌 바구니의 형태다.
-
넣은 데이터는 아래쪽에 쌓인다.
-
후입선출(LIFO:Last in first out): 가장 최근에 들어온 데이터가 가장 먼저 나간다.
스택과 큐
- 배열/리스트 vs 스택/큐
- 공통점: 선형 구조 이다.
- 차이점: 삽입과 삭제의 위치 고정 여부
- 배열/리스트: 임의의 위치에서 삽입/삭제
- 스택: 맨 위(top)
- 큐:
- 삽입: 맨 앞(front)
- 삭제: 맨 뒤(rear)
스택의 구현
- 배열을 이용한 구현
typedef struct Stack{
int top;
int arr[STACK];
}ArrayStack;
- 연결 자료구조(연결 리스트)를 이용한 구현
typedef struct StackNode{
int data; // 넣어줄 데이터
struct Node\* next; // 연결을 위한 자기참조 포인터
}Node;
typedef struct LinkedStack{
Node\* top; // top 표시
}Node;
배열 스택의 구현.cpp
#define MAX_STACK_SIZE 50
#define True 1
#define False 0
typedef int Bool;
typedef int Element;
typedef struct {
Element stackArr[MAX_STACK_SIZE];
int top;
} Stack;
// 스택 생성
Stack *Create(void) {
Stack *tempstack;
tempstack = malloc(sizeof(Stack));
tempstack->top = -1; // 맨 아래에 있음
return tempstack;
}
// 스택이 비었는 지 확인
Bool isEmpty(Stack \*pstack)
{
if (pstack->top == -1)
return True;
else return False;
}
// 스택이 포화 상태인가
Bool isFull(Stack \*pstack)
{
if (pstack->top == MAX_STACK_SIZE-1) // top은 -1부터 시작하기 때문에
return True;
else
return False;
}
// 스택에 삽입
void Push(Stack \*pstack, Element Data)
{
if(isFull(pstack)){
printf("Stack Overflow. \n");
exit(-1);
}
pstack->top += 1;
pstack->stackArr[pstack->top] = Data;
}
//스택에서 삭제
Element Pop(Stack \*pstack)
{
if(isEmpty(pstack)){
printf("Stack underflow. \n");
exit(-1);
}
return pstack->stackArr[pstack->top--];
}
// 마지막에 무엇이 있는지 확인
Element peek(){
if(isEmpty(pstack)){
printf("ERROR");
exit(-1);
}
return pstack->stackArr[pstack->top];
}
int main( ) {
Stack \*pstack;
int a;
pstack = Create();
Push(pstack, 1);
a = Pop(pstack);
printf("%d\n", a);
return 0;
}
- 배열로 구현한 스택의 장단점
- 장점: 쉽게 구현 가능하다
- 단점:
- 스택의 크기 변경이 어렵다
- 순차 자료구조의 단점을 가진다.
연결리스트 스택의 구현.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int element;
typedef struct stackNode{
element data;
struct stackNodeType\* link;
}stackNode;
typedef struct LinkedStackType{
stackNode\* top;
}LinkedStack;
type LinkedStack Stack;
void StackInit(Stack\* pstack){
pstack->top = NULL;
}
element isEmpty(Stack\* pstack){
if(pstack->top == NULL)
return 1;
return 0;
}
void push(Stack* pstack, element item){
stackNode* newNode = (stackNode\*)malloc(sizeof(stackNode));
newNode->data = data;
newNode->link = pstack->top;
pstack->top = newNode;
}
element pop(Stack* pstack){
element rdata;
stackNode* rnode;
if(isEmpty(pstack)){
printf("\n\n Stack is empty!\n");
exit(-1);
}
else{
rdata = pstack->top->data;
rnode = pstack->top;
pstack->top = pstack->top->link;
free(rnode);
return rdata;
}
}
elememt peek(Stack\* pstack){
if(isEmpty(pstack)){
printf("\n\n Stack is empty! \n");
exit(-1);
}
return pstack->top->data;
}