[자료ꡬ쑰] StackπŸ“š

LEESEUNGYEOLΒ·2022λ…„ 1μ›” 16일
0
post-thumbnail

μŠ€νƒ(Stack)πŸ“š

μŠ€νƒ?

  • 책이 μŒ“μ—¬μžˆλŠ” 이미지λ₯Ό μƒκ°ν•˜λ©΄ μ΄ν•΄ν•˜κΈ° μ’‹μŠ΅λ‹ˆλ‹€.
  • μ‚¬μ „μ μœΌλ‘œ 계속 μŒ“μ΄λ‹€λΌλŠ” μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€.
  • μŠ€νƒμ€ μΌμ’…μ˜ 리슀트
  • 단, λ°μ΄ν„°μ˜ μ‚½μž…κ³Ό μ‚­μ œκ°€ ν•œμͺ½ λμ—μ„œλ§Œ μΌμ–΄λ‚©λ‹ˆλ‹€.
  • LIFO(Last In First Out)
  • μ‚½μž…/μ‚­μ œκ°€ μΌμ–΄λ‚˜λŠ” μͺ½μ„ μŠ€νƒμ˜ top이라고 λΆ€λ¦…λ‹ˆλ‹€.

λ©”μ„œλ“œ

IsEmpty()

  • μŠ€νƒμ΄ λΉ„μ–΄μžˆμœΌλ©΄ True, μ•„λ‹ˆλΌλ©΄ Falseλ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.
int isempty() {
	if (top == -1) {//top은 -1λΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€.
		return 1;
	}
	return 0;
}

IsFull()

  • μŠ€νƒμ΄ 가득 μ°Όλ‹€λ©΄ True, μ•„λ‹ˆλΌλ©΄ Falseλ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€
int isfull() {
	if (top >= capacity - 1) {//top이 κ°€μž₯ 큰 μ‚¬μ΄μ¦ˆλ³΄λ‹€ ν¬κ±°λ‚˜ κ°™μœΌλ©΄ 가득 μ°¬ 것 μž…λ‹ˆλ‹€.
		return 1;
	}
	return 0;
}

push() 🌟

  • μŠ€νƒμ˜ top에 μ›μ†Œλ₯Ό ν•˜λ‚˜ μΆ”κ°€ν•©λ‹ˆλ‹€.
void push(item) {
	if (!isfull()) {//μΆ”κ°€ μ „ 확인    
		stack[++top].key = item;//λ§ˆμ§€λ§‰ 인덱슀인 top의 λ‹€μŒ 값을 ν¬μΈνŒ… ν•˜κ³ (++top) μ›μ†Œλ₯Ό λ„£μŠ΅λ‹ˆλ‹€.
	}
}

pop() 🌟

  • μŠ€νƒμ˜ top인 μ›μ†Œλ₯Ό ν•˜λ‚˜ μ œκ±°ν•©λ‹ˆλ‹€.
void pop(item) {
	if (!isempty()) {//제거 μ „  확인
		element item = stack[top]; //top의 μ›μ†Œλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
		top--;// ν¬μΈνŒ… ν•˜λŠ” top을 ν•˜λ‚˜ μ€„μž…λ‹ˆλ‹€.
	}
}

peek()

  • μŠ€νƒμ˜ 맨 μœ„μ— μžˆλŠ” μš”μ†Œλ₯Ό μ‚­μ œν•˜μ§€ μ•Šκ³  λ°˜ν™˜ν•©λ‹ˆλ‹€.
int peek(){
	if(!isempty()){
    	return stack[top];
    }
}

stack κ΅¬ν˜„ν•˜κΈ°

  • λ°°μ—΄ ν˜Ήμ€ μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

배열을 μ΄μš©ν•œ κ΅¬ν˜„

  • λ°°μ—΄λ‘œ κ΅¬ν˜„ν•˜λŠ” 방법은 κ°„λ‹¨ν•œ λ°˜λ©΄μ— μŠ€νƒμ˜ 크기가 κ³ μ •λ˜λŠ” 약점이 μžˆμŠ΅λ‹ˆλ‹€.
#include <stdio.h>
#define MAX_STACK_SIZE 100

char stack[MAX_STACK_SIZE];
int top = -1; // stack을 μ €μž₯ν•˜λŠ” top index

void push(int key) {
	if (is_full()) {
		return;
	}
	stack[++top] = key;
}

int pop() {
	if (is_empty()) {
		return;
	}
	int tmp = stack[top];
	top--;
	return tmp;
}

char peek() {
	return stack[top];
}
int is_empty() {
	return top == -1;
}
int is_full() {
	return top == MAX_STACK_SIZE - 1;
}

μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•œ κ΅¬ν˜„

  • μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•œ 방법은 κ΅¬ν˜„μ΄ μ•½κ°„ λ³΅μž‘ν•œ 반면, μŠ€νƒμ˜ 크기λ₯Ό ν•„μš”μ— 따라 κ°€λ³€μ μœΌλ‘œ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ—°κ²°λ¦¬μŠ€νŠΈμ˜ 맨 μ•ž 뢀뢄을 μŠ€νƒμ˜ top으둜 λ‘λŠ”κ²ƒμ΄ νŽΈν•©λ‹ˆλ‹€.
#include <stdio.h>
typedef struct {
	char* data;
	struct NODE* next;
}NODE;
NODE* top = NULL; //κ°€μž₯ 첫 λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

//add-first
void push(char* item) {
	NODE* node = (NODE*)malloc(sizeof(NODE));
	node->data = item; 
	node->next = top;
	top = node;
}

//remove-first
char* pop() {
	if (is_empty()) { //λΉ„μ–΄μžˆλ‹€λ©΄ NULLλ°˜ν™˜ν•©λ‹ˆλ‹€.
		return NULL;
	}
	char* result = top->data;
	NODE* p = top;
	top = top->next;
	free(p); //μ‚­μ œν•  λ…Έλ“œλ₯Ό μ—†μ• μ£ΌλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
	return result;
}

char* peek() {
	if (is_empty()) {
		return NULL;
	}
	return top->data;
}

int is_empty() {
	return top == NULL;
}

문제점

  • λ§Œμ•½ μŠ€νƒμ΄ λ™μ‹œμ— 2개 이상 ν•„μš”ν•˜λ‹€λ©΄?
  • stack λ°°μ—΄κ³Ό top이 μ „μ—­ λ³€μˆ˜λ‘œ μ„ μ–Έλ˜κΈ° λ•Œλ¬Έμ— 전체 ν”„λ‘œκ·Έλž¨μ—μ„œ μ—¬λŸ¬κ°œμ˜ μŠ€νƒμ„ μ‚¬μš©ν•˜κΈ° μ–΄λ ΅λ‹€.
    -> topκ³Ό stack배열을 ν•˜λ‚˜μ˜ ꡬ쑰체둜 κ²°ν•©μ‹œμΌœμ„œ 이 ꡬ쑰체의 포인터λ₯Ό ν•©μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬ν•œλ‹€.

<λ³΄μ™„ν•œ μ½”λ“œ>
큰 ν‹€λ§Œ ν˜•μ„±ν•˜λŠλΌ λ””ν…ŒμΌν•œ 점듀은 넣지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€ κ°μ•ˆν•΄μ£Όμ„Έμš” !

#include <stdio.h>
#define MAX_STACK_SIZE 100
typedef int element;
typedef StackType* Stack;
typedef struct { 
	element* stack; //stack λ°°μ—΄ -> λ™μ ν• λ‹ΉμœΌλ‘œ create ν•¨μˆ˜μ—μ„œ λ§Œλ“ λ‹€
	int top;
	int size; //λ°°μ—΄μ˜ 크기
}StackType;

Stack create() {
	Stack s = (Stack)malloc(sizeof(StackType));
	s->top = -1;
	s->size = MAX_STACK_SIZE;
	return s;
}

void push(StackType* s, element item) {
	if (is_full(s)) {
		return;
	}
	else s->stack[++(s->top)] = item;
}

element pop(StackType* s) {
	if (is_empty(s)) {
		exit(1);
	}
	else return s->stack[(s->top)--];
}

int main(void) {
	StackType* s1 = create();
	StackType* s2 = create();
	push(s1, 12);
	push(s2, 9);
	return 0;
}
  • μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ˜ 데이터λ₯Ό μ €μž₯ν•  μŠ€νƒμ΄ ν•„μš”ν•˜λ‹€λ©΄?
  • λ™μ‹œμ— 1가지 νƒ€μž…μ˜ 데이터 λ§Œμ„ μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ™μ‹œμ— μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ˜ 데이터λ₯Ό μ €μž₯ν•˜λŠ” 2개의 μŠ€νƒμ„ λ§Œλ“€ 수 μ—†μŠ΅λ‹ˆλ‹€.
  • void* νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ genericν•œ μŠ€νƒμ„ κ΅¬ν˜„ν•  수 μžˆμœΌλ‚˜ 단점이 μžˆμŠ΅λ‹ˆλ‹€.
  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ κ΅¬ν˜„ν•˜λŠ” 것이 μœ λ¦¬ν•©λ‹ˆλ‹€.

이미지 좜처
http://blog.naver.com/coolten/140057846054
http://dorson23.blogspot.com/2018/02/c-2-stack.html

profile
🐒

0개의 λŒ“κΈ€