C로 만드는 자료구조
스택 응용 문제들
plas
2020. 3. 13. 22:08
스택은 데이터의 순서를 뒤집어야 하는 경우에 유용하게 쓰인다. 스택을 임시 메모리로 사용하면 코드가 간결해진다.
(1) 문자열 뒤집기
문자열의 글자 순서를 뒤집는 문제는 스택을 이용하여 다음과 같이 해결할 수 있다. (널문자는 그대로 있음)
void reverse(char* word)
{
stack_t stack;
int i;
for (i = 0; i < strlen(word); i++)
push(&stack, word[i]);
i = 0;
while (!is_empty(&stack))
word[i++] = pop(&stack);
}
(2) 2진수로 바꾸기
2진수로 바꾸는 문제는 2로 나눈 나머지를 거꾸로 이어 붙여서 2진수를 만들 수 있다. 이 문제도 스택을 이용해서 다음과 같이 간단하게 바꿀 수 있다.
void print_binary(int n)
{
stack_t stack;
while (n > 0) {
push(&stack, n % 2);
n /= 2;
}
while (!is_empty(&stack))
printf("%d", pop(&stack));
}
(3) 주어진 단어가 거울문자열인지 검사하기
거울문자열인지 검사하는 문제도 스택을 이용하여 해결할 수 있다. (여기서는 typedef char element;여야 함)
int palindrome(char* word)
{
stack_t stack;
int i;
init_stack(&stack);
for (i = 0; i < strlen(word) / 2; i++)
push(&stack, word[i]);
if (strlen(word) % 2 > 0)
i++;
while (!is_empty(&stack))
if (word[i++] != pop(&stack))
return 0;
return 1;
}
(4) 괄호 짝 검사
괄호 짝 검사도 스택을 이용하기에 적합한 문제다. 여는 괄호는 푸시하고 닫는 괄호에서는 팝해서 짝이 맞나 확인한다. 괄호가 아닌 경우는 그냥 넘어가면 된다.
int paren(char* word)
{
stack_t stack;
int i;
init_stack(&stack);
for (i = 0; i < strlen(word); i++) {
if (word[i] == '(')
push(&stack, word[i]);
else if (word[i] == ')')
if (pop(&stack) != '(')
return 0;
}
return is_empty(&stack);
}
이런 문제 해결에 스택을 쓰면 코드가 간결하면서도 이해하기 쉬워진다는 점에서 큰 장점을 가진다.