문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
-첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
-출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
학습
처음 문제를 읽고 풀이를 구상했을 때 부터, 각 명령어를 함수로 정의하고 명령어를 입력하면 정의한 함수와 비교하여 실행하도록 코딩해야겠다고 생각했다. 따라서 cnt와 stack은 전역변수로 선언하고 push,pop,empty등 함수를 정의하였다. main함수에서는 입력과 함수가 일치하는 조건문을 만들고 싶어 구글링해보다가 strcmp라는 함수를 알게되었다. 그리고 추가로 알게된 not연산자 느낌표(!)의 쓰임도 같이 적어보려 한다.
(코드에서는 if(strcmp(명령어입력,"push")) 와같이 사용되었다. )
1. strcmp와 strncmp의 정의와 설명
헤더파일
<string.h>
정의
int strcmp(const char* str1, const char* str2)
int strncmp(const char* str1, const char* str2, size_t n);
*strncmp는 str/n/cmp로 기존 strcmp에서 n개의 수만큼만 검사한다는 뜻이다.
이때 n의 자료형은 uint이다.
설명
매개변수로 들어온 두개의 문자열을 비교하여 문자열이 완전히 같다면 0을 반환, 다르면 음수(-1) 혹은 양수(+1)을 반환한다.
반환되는 음수와 양수 값은 매개변수로 들어온 문자열들을 비교하다가 다른문자가 나왔을때 그 문자의 아스키 코드 값에 의해서 정해진다.
(1) str1 < str2 인 경우에는 음수 반환
(2) str1 > str2 인 경우에는 양수 반환
(3) str1 == str2 인 경우에는 0을 반환 한다.
또한 대소문자를 구분하므로 이를통해 구분할 수도 있다.
예시
char str1[] = “ronron”;
char str2[] = “ronron”;
strcmp(str1, str2); // 문자열이 같으므로 0
strcmp(str1, aronron”); // r < a 이므로 음수 반환
strcmp(str1, zronron”); // r > z 이므로 양수 반환
2. not연산자 느낌표(!)
위에서 설명했던 strcmp(), strncmp() 를 참고하면 두 매개변수 값이 일치하였을 때 0을 반환한다. 이 함수 앞에 not연산자인 !를 붙이면 어떻게 될까
strcmp() 함수 앞에 붙어있는 느낌표(!) 즉, 부정(not) 을 의미하는 연산자에 의해 0 값이 1 값으로 바꾸어지게 되며, 결국 if 조건문은 참(true) 값을 가질 때 수행되는 코드를 실행하게 된다. 즉, if() 의 값은 strcmp() 함수 앞에 붙어있는 not 연산자(!) 에 의해 0 이 아닌값이 0 으로 바뀌며, 결국 if 조건문은 거짓(false) 값을 가질 때 수행되는 코드(else 절의 코드)를 실행하게 된다.
scanf("%s", &order); if (!strcmp(order, "push")) { int n; scanf("%d", &n); push(n); }
따라서, 제 코드에 쓰인 이 부분을 해석하면 order 매개변수와 "push" 문자열을 비교하였을 때 일치하면 1(사실은 0이지만 not연산자에 의해 1 반환) 이 반환되므로 push함수가 실행된다.
코드
#include <stdio.h> int stack[100001]; int cnt = 0; void push(int n) { stack[cnt] = n; cnt++; } void pop() { if (cnt != 0) { cnt--; printf("%d\n", stack[cnt]); stack[cnt] = 0; } else { printf("%d\n", -1); } } void top() { if (cnt != 0) { printf("%d\n", stack[cnt - 1]); } else { printf("%d\n", -1); } } void empty() { if (cnt != 0) { printf("0\n"); } else { printf("1\n"); } } void size() { printf("%d\n", cnt); } int main() { int stackSize; char order[10]; scanf("%d", &stackSize); int stack[stackSize]; while (stackSize!=0) { scanf("%s", &order); if (!strcmp(order, "push")) { int n; scanf("%d", &n); push(n); } else if (!strcmp(order, "top")) { top(); } else if (!strcmp(order, "size")) { size(); } else if (!strcmp(order, "empty")) { empty(); } else { pop(); } stackSize--; } }
출처
www.acmicpc.net/problem/10828
strcmp,strncmp 정의와 설명에 관련한 부분은 이 블로그를 많이 참고하였습니다.
'프로그래밍 > C, C++' 카테고리의 다른 글
[C] 백준 10872 팩토리얼 (0) | 2021.03.22 |
---|---|
[C] 백준 10773 제로 (0) | 2021.03.21 |
[C] 백준 1002 터렛 ✈️ (0) | 2021.03.16 |
[C] 문자열 fgets, gets 차이 (0) | 2021.03.15 |
[C] 백준 2839번 설탕배달 🧁 (0) | 2021.01.30 |