'백준 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 |