Data Structure

스택 (Stack)

studioesso 2020. 4. 22. 16:02

 

후입 선출(LIFO : Last-In First-out),

가장 최근에 들어온 데이터가 가장 먼저 나가고 가장 나중에 들어온 데이터가 가장 나중에 나가는 자료 구조

 

연산

push : 데이터를 넣는다.

pop : 데이터를 꺼낸다.

peek : 가장 위에 있는 데이터를 반환한다.

isEmpty : 스택이 비어있는지 확인한다.

 

추가 삭제 연산은 상수시간에 가능하나, (연결 리스트로 구현하면 메모리 할당 및 해제 시간이 배열보다 조금 더 걸린다.)

특정 항목에 대한 접근은 상수 시간안에 불가능 하다.

 

/*
	연결 리스트로 구현한 스택
	코드 출처 : C언어로 쉽게 풀어쓴 자료구조 / 생능출판 / 천인국, 공용해, 하상호 지음 
*/
#include <stdio.h>
#include <malloc.h>

typedef int element;
typedef struct StackNode {
    element item;
    struct StackNode *link;
} StackNode;

typedef struct {
    StackNode *top;
} LinkedStackType;

void init(LinkedStackType *s)
{
    s->top = NULL;
}

int isEmpty(LinkedStackType *s)
{
    return (s->top == NULL);
}

void push(LinkedStackType *s, element item)
{
    StackNode *temp = (StackNode *)malloc(sizeof(StackNode));
    
    if(temp == NULL) {
        fprintf(stderr, "메모리 할당에러\n");
        return;
    }
    else {
        temp->item = item;
        temp->link = s->top;
        s->top = temp; //스택 맨 위 포인터에 새로 넣은 노드의 주소를 넣는다.
    }
}

element pop(LinkedStackType *s)
{
    if(isEmpty(s)) {
        fprintf(stderr, "스택이 비어있음\n");
        exit(1);
    }
    else {
        StackNode *temp = s->top;
        element item = temp->item;
        s->top = s->top->link; //top은 맨 위 아래 데이터를 가리킨다.
        
        free(temp);
        return item;
    }
}

element peek(LinkedStackType *s)
{
    if(isEmpty(s)) {
        fprintf(stderr, "스택이 비어있음\n");
        exit(1);
    }
    else {
        return s->top->item;
    }
}

void main() {
    LinkedStackType s;
    init(&s);
    push(&s, 1);
    push(&s, 2);
    printf("%d\n", pop(&s));
    printf("%d\n", pop(&s));
    printf("%d\n", isEmpty(&s));
}

'Data Structure' 카테고리의 다른 글

트리 (Tree)  (0) 2020.05.05
비트마스크 (Bitmask)  (0) 2020.04.28
큐 (Queue)  (0) 2020.04.23
연결 리스트 (Linked List)  (0) 2020.04.21
힙 (Heap)  (0) 2020.04.19