본문 바로가기

코딩/코딩 꿀팁

C언어로 가장 쉽게 스택(stack) 이해하기!

728x90
반응형

코딩에는 크게 두가지의 단계가 있다고 생각합니다.

 

크게 첫번째는 그 언어의 문법(예를 들어 if문이나 for문 등등)을 원하는 때에 적재적소로 사용할 수 있는 단계!

두번째는 자료구조와 알고리즘을 이용해 더 어려운 문제를 풀기 위한 발판을 만드는 단계!

 

이글은 두번째 단계의 시작인 사람(저도 포함입니다 ㅎㅎ)들을 위해서 작성했습니다 ㅎㅎ

 

스택(stack) 부터 시작해보시죠!!

 

스택 구현(stack)

단계 나누기

1. 구조체 및 변수 선언

2. 스택 초기화 함수(init_stack)

3. 공백 상태 검출 함수(is_empty)

4. 포화상태 검출 함수(is_full)

5. 삽입함수(push)

6. 삭제함수(pop)

7. 엿보기함수(peek)

 

 

1. 구조체 및 변수 선언

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS

#define MAX_SIZE_STACK 100 // MAX_SIZE_STACK는 100 이라고 선언

typedef char element; // char 를 이제부터 element라고 선언

typedef struct { 
	element data[MAX_SIZE_STACK]; // char data[100];
	int top; // LIFO 방식의 스택의 현재 가장 최근에 들어온 data의 인덱스
} StackType; //구조체를 이제 StackType으로 접근하기로 선언

 

2. 스택 초기화 함수(init_stack)

void init_stack(StackType* s) { //StackType 구조체 포인터를 매개변수 s로 받겠다는 뜻
	s->top = -1; // 기본적으로 -1을 가르키라는 뜻
}

3. 공백 상태 검출 함수(is_empty)

int is_empty(StackType* s) {
	return (s->top == -1);
}

 

4. 포화상태 검출 함수(is_full)

int is_full(StackType* s) {
	return (s->top == (MAX_SIZE_STACK - 1)); //배열 data의 꼭대기에 top이 있다면 포화상태라는 뜻
}

5. 삽입함수(push)

void push(StackType* s, element item) { // char item을 하나 추가로 매개변수를 받음
	if (is_full(s)) {
		fprintf(stderr, "포화상태\n"); // 삽입하려 했는데 포화상태라면 '포화상태'라고 출력
		return;
	}

	else s->data[++(s->top)] = item; // 포화상태가 아니라면  data의 top+1번째 인덱스에 item을 삽입
}

6. 삭제함수(pop)

element pop(StackType* s) {
	if (is_empty(s)) {
		fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
		exit(1); //프로그램 종료
	}
	else return s->data[(s->top)--]; // data의 top번째 인덱스의 값을 리턴하고 top값을 -1 함
}

7. 엿보기함수(peek)

element peek(StackType* s) {
	if (is_empty(s)) {
		fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
		exit(1); //프로그램 종료
	}
	else return s->data[(s->top)]; // data의 top번째 인덱스의 값을 리턴
}

 

8. 스택(stack) 함수 전체 코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS

#define MAX_SIZE_STACK 100 // MAX_SIZE_STACK는 100 이라고 선언

typedef char element; // char 를 이제부터 element라고 선언

typedef struct { 
	element data[MAX_SIZE_STACK]; // char data[100];
	int top; // LIFO 방식의 스택의 현재 가장 최근에 들어온 data의 인덱스
} StackType;

void init_stack(StackType* s) { //StackType 구조체 포인터를 매개변수 s로 받겠다는 뜻
	s->top = -1; // 기본적으로 -1을 가르키라는 뜻
}

int is_empty(StackType* s) {
	return (s->top == -1);
}


int is_full(StackType* s) {
	return (s->top == (MAX_SIZE_STACK - 1));
}

void push(StackType* s, element item) { // char item을 하나 추가로 매개변수를 받음
	if (is_full(s)) {
		fprintf(stderr, "포화상태\n"); // 삽입하려 했는데 포화상태라면 '포화상태'라고 출력
		return;
	}

	else s->data[++(s->top)] = item; // 포화상태가 아니라면  data의 top+1번째 인덱스에 item을 삽입
}

element pop(StackType* s) {
	if (is_empty(s)) {
		fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
		exit(1); //프로그램 종료
	}
	else return s->data[(s->top)--]; // data의 top번째 인덱스의 값을 리턴하고 top값을 -1 함
}

element peek(StackType* s) {
	if (is_empty(s)) {
		fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
		exit(1); //프로그램 종료
	}
	else return s->data[(s->top)]; // data의 top번째 인덱스의 값을 리턴
}

 

9. 스택(stack) 함수 눈에 보이게 출력하는 main 함수

int main() {
	StackType stack;

	init_stack(&stack); // 스택 초기화

	// A, B, C를 스택에 push
	push(&stack, 'A');
	push(&stack, 'B');
	push(&stack, 'C');

	printf("스택에서 꺼낸 문자열: ");
	// 스택이 빌 때까지 스택에서 문자를 꺼내서 출력
	while (!is_empty(&stack)) {
		printf("%c ", pop(&stack));
	}
	printf("\n");

	return 0;
}

 

 


스택(stack) 함수(최종 코드)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS

#define MAX_SIZE_STACK 100 // MAX_SIZE_STACK는 100 이라고 선언

typedef char element; // char 를 이제부터 element라고 선언

typedef struct { 
	element data[MAX_SIZE_STACK]; // char data[100];
	int top; // LIFO 방식의 스택의 현재 가장 최근에 들어온 data의 인덱스
} StackType;

void init_stack(StackType* s) { //StackType 구조체 포인터를 매개변수 s로 받겠다는 뜻
	s->top = -1; // 기본적으로 -1을 가르키라는 뜻
}

int is_empty(StackType* s) {
	return (s->top == -1);
}


int is_full(StackType* s) {
	return (s->top == (MAX_SIZE_STACK - 1));
}

void push(StackType* s, element item) { // char item을 하나 추가로 매개변수를 받음
	if (is_full(s)) {
		fprintf(stderr, "포화상태\n"); // 삽입하려 했는데 포화상태라면 '포화상태'라고 출력
		return;
	}

	else s->data[++(s->top)] = item; // 포화상태가 아니라면  data의 top+1번째 인덱스에 item을 삽입
}

element pop(StackType* s) {
	if (is_empty(s)) {
		fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
		exit(1); //프로그램 종료
	}
	else return s->data[(s->top)--]; // data의 top번째 인덱스의 값을 리턴하고 top값을 -1 함
}

element peek(StackType* s) {
	if (is_empty(s)) {
		fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
		exit(1); //프로그램 종료
	}
	else return s->data[(s->top)]; // data의 top번째 인덱스의 값을 리턴
}


int main() {
	StackType stack;

	init_stack(&stack); // 스택 초기화

	// A, B, C를 스택에 push
	push(&stack, 'A');
	push(&stack, 'B');
	push(&stack, 'C');

	printf("스택에서 꺼낸 문자열: ");
	// 스택이 빌 때까지 스택에서 문자를 꺼내서 출력
	while (!is_empty(&stack)) {
		printf("%c ", pop(&stack));
	}
	printf("\n");

	return 0;
}
반응형