첫번째 게시물로 공부했던 스택 응용프로그램을 올리기로 했다. 뭔가 두근두근한 기분.
다음에는 프로그래머스 문제나 백준을 올리는 게 목표다 ㅎ..
이 프로그램은 괄호가 올바르게 사용되었는지 검사하는 프로그램이다. 예를 들어
{ ( A[i] ) } 이런 식의 문자열이 있다면 이건 올바르게 작성된 것이고,
{ ( A[i) ] } 이런 문자열은 실패한 문자열을 검사하는 프로그램이다.
스택이 맨 나중에 것만 뺄 수 있다는 장점이 있고 차례대로 저장할 수 있으니 괄호를 왼쪽 괄호들 ( , [ , { 를 스택에 저장하고 오른쪽 괄호 ), ], } 를 체크할 때 왼쪽 괄호와 쌍이 맞는 지 검사하는 방법이다. 마지막으로 스택에서 차례대로 다 뺐는데, 스택에 예를 들어 { 가 남아 있다면 그것은 오른쪽 }가 없다는 의미이므로 이것 또한 실패이다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_SIZE 100
typedef char element;
typedef struct {
element data[MAX_STACK_SIZE];
int top;
} StackType;
//스택 초기화 함수
void init_stack(StackType *s)
{
s->top = -1;
}
//공백 상태 검출 함수
int is_empty(StackType *s)
{
return (s->top == -1);
}
//포화 상태 검출 함수
int is_full(StackType *s)
{
return (s->top == (MAX_STACK_SIZE-1));
}
//삽입
void push(StackType *s,element item)
{
if (is_full(s)){
fprintf(stderr,"스택포화에러\n");
return;
}
else s->data[++(s->top)] = item;
}
//삭제
element pop(StackType *s)
{
if (is_empty(s)){
fprintf(stderr,"스택 공백 에러\n");
exit(1);
}
else return s->data[(s->top)--];
}
//피크함수
element peek(StackType *s)
{
if (is_empty(s)){
fprintf(stderr,"스택 공백에러 \n");
exit(1);
}
else return s->data[s->top];
}
int check_matching(const char *in)
{
StackType s;
char ch, open_ch;
int i, n = strlen(in); // n은 문자열의 길이
init_stack(&s); // 스택의 초기화
for ( i=0; i<n;i++){
ch = in[i]; //ch는 다음문자
switch(ch){
case '(': case '[': case '{':
push(&s,ch);
break;
case ')': case ']': case '}':
if (is_empty(&s)) return 0;
else {
open_ch = pop(&s);
if ((open_ch == '(' && ch != ')') ||
(open_ch == '[' && ch != ']') ||
(open_ch == '{' && ch != '}')) {
return 0;
}
break;
}
}
}
if (!is_empty(&s)) return 0; //스택이 남아있으면 오류
return 1;
}
int main(void)
{
char *p ="{A[i+1]=0;}";
if (check_matching(p) == 1)
printf("%s 괄호검사성공\n",p);
else
printf("%s 괄호검사실패\n",p);
return 0;
}
첫 게시물을 올리며: 기록으로 남기니까 뿌듯하기도 하고 재밌다.
앞으로도 양질의 문제를 풀면서 실력을 키워가야겠다.
파이팅입니다!