둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (225)
    • 프로그래머스 (1)
      • 해시 (1)
    • BOJ (176)
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (31)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (14)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
      • 누적합 (5)
      • 유니온 파인드 (1)
      • 분할 정복 (2)
    • 자료구조 (15)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (2)
      • 힙 (1)
      • 정렬 (1)
    • C++ (11)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (6)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • STL C++
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

자료구조/스택

스택 (구조체로 구현)

2021. 12. 22. 23:21

'백준 10828번: 스택' 문제를 베이스로 둔 구조체로 구현한 스택의 코드다.

 

//스택을 구조체로 구현하기

//push X: 정수 X를 스택에 넣는 연산이다.
//pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
//size: 스택에 들어있는 정수의 개수를 출력한다.
//full: 스택이 꽉 찼으면 1, 아니면 0을 출력한다.
//empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
//top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

#include <stdio.h>
#include <string.h>
#define MAX 100000

typedef struct Stack{
	int arr[MAX];
	int top;
}Stack;

void InitStack(Stack *stack) //스택 초기화: top=-1
{
	stack->top=-1;
}

int full(Stack *stack)
{
	/*
	if(stack->top+1==MAX)
		return 1;
	return 0;
	*/
	return (stack->top+1)==MAX;
}

int empty(Stack *stack)
{
	/*
	if(stack->top==-1)
		return 1;
	return 0;
	*/
	return (stack->top)==-1;
}

int size(Stack *stack)
{
	return stack->top+1;
}

int top(Stack *stack)
{
	if(empty(stack)==1)
		return -1;
	return stack->top+1;
}

void push(Stack *stack, int num)
{
	/*
	if(stack->top+1==MAX)
	{
		printf("스택이 꽉참\n!!");
		return;
	}
	*/ 
	//main에서 몇 개의 명령을 입력 받을건지 안 정하고 하는거면 위 if문이 있어야 안전하게 돌아간다.
	
	stack->top++; //push하면 top 1씩 증가
	stack->arr[stack->top]=num; //num을 push한 위치에 저장
}

int pop(Stack *stack)
{
	if(stack->top==-1)
	{
		return -1;
	}
	int popnum = stack->arr[stack->top];
	stack->top--; //pop하면서 top 1씩 감소
	return popnum;
}

int main(void)
{
	Stack stack;
	InitStack(&stack); //stack 초기화
	char Get_Com[10];
	int N,pushnum;
	scanf("%d",&N);
	for(int i=0;i<N;i++)
	{
		scanf("%s",Get_Com);
		if(strcmp(Get_Com,"push")==0)
		{
			scanf("%d",&pushnum);
			push(&stack,pushnum);
		}
		else if(strcmp(Get_Com,"pop")==0)
			printf("%d\n",pop(&stack));
		else if(strcmp(Get_Com,"size")==0)
			printf("%d\n",size(&stack));
		else if(strcmp(Get_Com,"empty")==0)
			printf("%d\n",empty(&stack));
		else if(strcmp(Get_Com,"full")==0)
			printf("%d\n",full(&stack));
		else if(strcmp(Get_Com,"top")==0)
			printf("%d\n",top(&stack));
	}
	return 0;
}

 

느낀 점

 

코드를 다 짜고 다른 사람들의 구현을 보는데 내가 초짜라서 그런지 모르겠지만 내가 몰랐던 표현법을 설명하겠다.

int full(Stack *stack)
{
	if(stack->top+1==MAX)
		return 1;
	return 0;
}
int full(Stack *stack)
{
	return (stack->top+1)==MAX;
}

두 full 함수 구현에서의 차이가 확연히 보인다.

위의 코드는 세줄에 거쳐 값을 리턴하는 반면, 밑에 코드는 == 의 좌우가 같으면 1, 아니면 0을 한 번에 리턴해준다.

그렇게 중요하진 않지만, 재밌는 것 같아서? 설명해봤다.

 

비슷한 경우로 while문을 항상 while(1)과 break, while(num) , while(n>0) {~ n--;} 식으로만 활용했는데 

while(n--)을 보고 이마를 탁 쳤다. 위의 경우처럼 겨우 몇 줄을 줄이는 일이지만 역시나 이런 소소한 코드를 줄일 수 있는 것을 배울 때 재밌다. 이런 거에 감탄하는 나는 역시 코딩 초짜 같다... 열심히 살자

저작자표시 (새창열림)

'자료구조 > 스택' 카테고리의 다른 글

스택 (연결리스트로 구현)  (0) 2021.12.26
스택 (배열로 구현)  (0) 2021.12.22
    '자료구조/스택' 카테고리의 다른 글
    • 스택 (연결리스트로 구현)
    • 스택 (배열로 구현)
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바