林's

[자료구조] C++로 만드는 stack 해답 본문

프로그래밍/Etc

[자료구조] C++로 만드는 stack 해답

풀림이 2019. 4. 11. 21:56

이론 공부후 바로 문제를 풀어봅시다! 

문제 풀러가기

#define _CRT_SECURE_NO_WARNINGS
#include cstdio;
using namespace std;

int stack[100001];			// 스택을 위한 넉넉한 여유공간
int top = -1;				// top(stack pointer): 스택의 꼭대기를 가리키는 인덱스
							// 스택은 데이터를 위로 쌓아가므로 빈상태는 0이 아니라 -1을 가리킴
							// 넣을 때마다 ++ 해주고 뺄때마다 --해주면 되겠지?
int empty()
{
	return top == -1 ? 1 : 0;	// 스택의 꼭대기가 초기상태인 -1을 가리키면 스택이 빈상태
}
int full()
{
	return top == 100000 ? 1 : 0; // 인덱스가 최대값인 10만이 되면 꽉찬것임
}
int getSize()					// 스택의 꼭대기(top) 가 가리키는 곳을 읽으면 스택 크기를 알 수 있겠지?
{
	int size = top + 1;			// top이 0을 가리킬 때 1개니까 top이 x를 가리키면 크기는 x+1이 겠지?
	return size;
}

int getTop()		// 스택은 비어있을 때랑 꽉차 있을 때를 항상 유의하면서 짜야해!
{
	if (empty())	// 스택이 비어있을 수도 있어
	{
		return -1;
	}
	else
	{
		return stack[top];	// 안 비어 있으면 그냥 꼭대기에 있는 값을 주면 돼.
	}
}

void push(int x)		// top이 가리키는 곳은 스택의 꼭대기라고 했어. 거기엔 값이 이미 들어있지
{						// 데이터를 넣는 작업인 push 를 수행하려고 하니 스택 포인터를 위로 한칸 먼저 올리고
	if (full()) return; // 거기에 값을 넣어야겠지? 그래서 stack[top++]로 하면 꼭대기 값이 덮어씌워질 거야.
	stack[++top] = x;
}
void pop()			    // 스택은 항상 꼭대기에서 값을 꺼낼 수 있어.
{
	if (empty())		// 비어있으면 못 꺼내겠지?
	{
		printf("-1\n");
	}
	else
	{
		printf("%d\n", stack[top--]); // 그게 아니라면 꺼낸 다음(stack[top])에 스택 포인터를 아래로 한칸 내리면 될거야(top--) 이건 이 두 문장을 합친것이지.
	}
}

int main()
{
	int N;				// 명령어의 개수
	int x;				// 스택에 넣을 데이터
	char comm[11];		// 명령어 문자열을 위한 공간

	scanf("%d", &N);	// 명령어 개수 입력받기

	while (N--)			// 명령어 개수만큼 반복(반복문이 N번 실행되면, N이 0이 되면서 while문 탈출!)
	{
		scanf("%s", comm); // 명령어 입력받기
		if (comm[0] == 'p' && comm[1] == 'u') // push
		{
			scanf("%d", &x);
			push(x);
		}
		else if ((comm[0] == 'p') && (comm[1] == 'o')) // pop
		{
			pop();
		}
		else if (comm[0] == 't')	// top
		{
			printf("%d\n", getTop());
		}
		else if (comm[0] == 's')	// size
		{
			printf("%d\n", getSize());
		}
		else if (comm[0] == 'e')	// is empty?
		{
			printf("%d\n", empty());
		}
	}

	return 0;
}
Comments