거북이의 IT 공부

[백준 10828] 스택 - C, C++ 본문

Baekjoon

[백준 10828] 스택 - C, C++

버니빈 2020. 3. 28. 02:25

문제

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

 

10828번: 스택

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

www.acmicpc.net

C언어 - 나의 코드

 

#define _CRT_SECURE_NO_WARNINGS
#define MAX_STACK_SIZE 10000
#define True 1
#define False 0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
	int stackArr[MAX_STACK_SIZE];
	int top;
} Stack;

int empty(Stack* pstack) {
	if (pstack->top == -1)
		return True;
	else return False;
}

int full(Stack* pstack) {
	if (pstack->top == MAX_STACK_SIZE - 1)
		return True;
	else return False;
}

void push(Stack* pstack, int data) {
	if (!full(pstack))
		pstack->stackArr[++pstack->top] = data;
	else return;
}

int pop(Stack* pstack) {
	if(!empty(pstack))
		return pstack->stackArr[pstack->top--];
	return -1;
}

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

int top(Stack* pstack) {
	if (!empty(pstack))
		return pstack->stackArr[pstack->top];
	else return - 1;
}

int main(void) {
	int n, add;
	char com[10];
	Stack* pstack = (Stack*)malloc(sizeof(Stack));
	pstack->top = -1;

	scanf("%d", &n);

	for (int i = 0; i < n; i++) {
		scanf("%s", com);
		fgetc(stdin);  //버퍼 지우기!!
	
		if (!strcmp(com,"push")) {
			scanf("%d", &add);
			fgetc(stdin);
			push(pstack, add);
		}
		else if (!strcmp(com, "pop")) {
			printf("%d\n", pop(pstack));
		}
		else if (!strcmp(com, "size")) {
			printf("%d\n", size(pstack));
		}
		else if (!strcmp(com, "empty")) {
			printf("%d\n", empty(pstack));
		}
		else if (!strcmp(com,"top")) {
			printf("%d\n", top(pstack));
		}
	}
}  

 

배운점

1. fgetc(stdin);

이런 기능이 있는줄도 여태까지 모르고 있었다니.....(좌절)

int fgetc(FILE* stream);  : 스트림(stream) 에서 문자 하나를 읽어온다.

인자로 전달한 stream 의 파일 위치 지정자가 가리키는 문자를 리턴한다. 이 때 파일 위치 지정자는 그 다음 문자를 가리키게 된다.

입력값(ex. push 1)에서 빈칸을 다음을 가리키게 되어 다음 scanf("%d", &add)가 실행될 수 있게 한다.

(즉, com 입력 -> fgetc덕분에 빈칸 입력 -> add 입력)

 

2. c언어에서 문자열 비교는 무조건 strcmp

안그러면 비교 자체가 안된다.

if(str1 == str2) // 문자열 비교가 아니라 포인터 비교가 된다!

 

 

C++ - 나의 코드

#include 
#include 
#include 

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	stack s;
	int num;

	cin >> num;
	for (int i = 0; i < num; i++) {
		string com;
		cin >> com;
		if (!com.compare("push")) { //str.compare() - c에서의 strcmp()
			int com_end;
			cin >> com_end;         //또는 if(com == "push") 
			s.push(com_end);
		}
		else if (!com.compare("pop")) {
			if (s.empty())
				cout << -1 << '\n';
			else {
				cout << s.top() << '\n';
				s.pop();
			}
		}
		else if (!com.compare("size")) {
			cout << s.size() << '\n';
		}
		else if (!com.compare("empty")) {
			if (s.empty())
				cout << 1 << '\n';
			else
				cout << 0 << '\n';
		}
		else if (!com.compare("top")) {
			if (s.empty())
				cout << -1 << '\n';
			else 
				cout << s.top() << '\n';
		}
	}
}
Comments