티스토리 뷰

>문제

> 핵심

스택

>풀이과정

그냥 스택 문제다.

자료구조 시간때 스택을 배운 사람들이라면 이런 코드는 수업시간때 한번쯤은 짜봤지 않을까 하는 생각이 든다. ㅋㅋㅋ

 

그래도 이 기회에 스택에 대해 개념을 확실히 다져놓고 넘어가자.

일단 C언어에서 False = 0, True = 0이 아닌 모든것(1) 이라는거 제발 좀 까먹지 말자.. 왜자꾸 까먹는지.. 

 

· 스택 구조체 선언 및 초기화

#define SIZE 10001

typedef struct
{
	int stack[SIZE];
	int n;
}StackType;

void init_stack(StackType* s)
{
	s->n = -1;
}

스택 구조체 StackType를 만들고, s->n=-1로 초기화 하여 첫 값이 0번째 인덱스에 들어가도록 세팅

 

· 스택이 가득 찼는지? / 텅 비었는지?

int is_full(StackType* s)
{
	return (s->n == SIZE - 1);
}

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

스택이 가득 찼는지 보는 is_full 함수.

s->n 이 SIZE-1. 그니까 stack 배열의 끝까지 갔다면 (True, 1) 그게 아니라면 (False, 0) 을 return한다.

스택이 비었는지 확인하는 is_empty 함수.

초기화 했을때와 같이 s->n == -1 이면 비었다고 확인하고 결과값 return.

 

· Push

void push(StackType* s, int e)
{
	if (is_full(s))
		return;

	s->stack[++s->n] = e;
}

스택이 꽉 찼나요?

아니면 s.n을 하나 증가시킨 다음에 stack 배열에 값 넣기.

 

· Pop

int pop(StackType* s)
{
	if (is_empty(s))
		return -1;

	int e = s->stack[s->n--];
	return e;
}

스택이 비었나요? 그럼 return -1

아니면 현재 stack 인덱스의 값을 e 에 넣어놓고 s->n--. 그 이후에 e를 return.

 

· 현재 스택의 사이즈는?

int size(StackType* s)
{
	return s->n + 1;
}

s->n 이 -1부터 시작하니까. +1 해줘서 return 함.

 

· 스택에 꼭대기에는?

int top(StackType* s)
{
	if (is_empty(s))
		return -1;
	return s->stack[s->n];
}

스택이 비었나요? 그럼 return -1.

아니면 제일 꼭대기에 있는 값 return.

 

>깨달은점

스택은 어렵지 않다 :D

>코드

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

#define SIZE 10001

typedef struct
{
	int stack[SIZE];
	int n;
}StackType;

void init_stack(StackType* s)
{
	s->n = -1;
}

int is_full(StackType* s)
{
	return (s->n == SIZE - 1);
}

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

void push(StackType* s, int e)
{
	if (is_full(s))
		return;

	s->stack[++s->n] = e;
}

int pop(StackType* s)
{
	if (is_empty(s))
		return -1;

	int e = s->stack[s->n--];
	return e;
}

int top(StackType* s)
{
	if (is_empty(s))
		return -1;
	return s->stack[s->n];
}

int size(StackType* s)
{
	return s->n + 1;
}

int main()
{
	StackType s; init_stack(&s);
	char op[6];
	int i, n, e;

	scanf("%d", &n);

	for (i = 0; i < n; i++)
	{
		scanf(" %s", op);

		if (strcmp(op, "push") == 0)
		{
			scanf(" %d", &e);
			push(&s, e);
		}
		else if (strcmp(op, "pop") == 0)
		{
			e = pop(&s);
			printf("%d\n", e);
		}
		else if (strcmp(op, "top") == 0)
		{
			e = top(&s);
			printf("%d\n", e);
		}
		else if (strcmp(op, "empty") == 0)
		{
			e = is_empty(&s);
			printf("%d\n", e);
		}
		else if (strcmp(op, "size") == 0)
		{
			e = size(&s);
			printf("%d\n", e);
		}
	}

	return 0;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함