거북이의 IT 공부
[백준 10828] 스택 - C, C++ 본문
문제
https://www.acmicpc.net/problem/10828
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'; } } }
'Baekjoon' 카테고리의 다른 글
RE. [백준 6198] 옥상 정원 꾸미기 - C++ / 알고리즘 monotone stack (0) | 2020.04.04 |
---|---|
[백준 2493] 탑 - C++ / 알고리즘 '스택' (0) | 2020.04.03 |
[백준 1406] 에디터 - C++ / 알고리즘 '연결 리스트' (0) | 2020.03.28 |
[백준 1158] 요세푸스 문제 - C++ / 알고리즘 '연결 리스트' (0) | 2020.03.27 |
[백준 10808] 알파벳 개수 - c언어 (0) | 2020.03.26 |
Comments