본문 바로가기
알고리즘

[C] 백준 10828

by mokhwasomssi 2022. 1. 16.

 

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

스택 

- 선형 자료구조

- LIFO(Last-In, First-Out)

- 배열 기반 구현

- 연결리스트 기반 구현

 

스택 ADT

- init

- empty

- push

- pop

- peek

 

ADT(Abstract Data Type)

- 추상자료형

- 구체적인 기능의 완성과정을 언급하지 않고, 순수하게 기능이 무엇인지를 나열한 것

 

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

typedef struct
{
	int arr[10000];
	int top;
} stack;

void init(stack* ps)
{
	ps->top = -1; // -1은 스택에 데이터가 없는 상태
}

void push(stack* ps, int data)
{
	ps->top++;
	ps->arr[ps->top] = data;
}

void pop(stack* ps)
{
	if (ps->top >= 0) // 스택에 데이터가 있으면
	{
		printf("%d\n", ps->arr[ps->top]);
		ps->top--;
	}
	else // 없으면
		printf("-1\n");
}

void size(stack* ps)
{
	printf("%d\n", ps->top + 1);
}

void isEmpty(stack* ps)
{
	if (ps->top == -1)
		printf("1\n");
	else
		printf("0\n");
}

void top(stack* ps)
{
	if (ps->top >= 0)
		printf("%d\n", ps->arr[ps->top]);
	else
		printf("-1\n");
}

stack mystack;

int main()
{
	char str[20];
	int n, data;
	scanf("%d", &n);

	init(&mystack);

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

		if (strcmp(str, "push") == 0)
		{
			scanf("%d", &data);
			push(&mystack, data);
		}
		else if (strcmp(str, "pop") == 0)
		{
			pop(&mystack);
		}
		else if (strcmp(str, "size") == 0)
		{
			size(&mystack);
		}
		else if (strcmp(str, "empty") == 0)
		{
			isEmpty(&mystack);
		}
		else if (strcmp(str, "top") == 0)
		{
			top(&mystack);
		}
	}

	return 0;
}