datastructure,

스택과 큐

Jul 08, 2020 · 5 mins read

스택의 개념

  • 한 쪽이 막힌 바구니의 형태다.

  • 넣은 데이터는 아래쪽에 쌓인다.

  • 후입선출(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;
}
Written by