C연습

stack 괄호 짝 맞추기

CMS419 2021. 1. 17. 11:39
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int element;

typedef struct {
	element *data;
	int capacity;
	int top;
} stacktype;


void init_stack(stacktype *s, int n)
{
	s->top = -1;
	s->capacity = n;
	s->data = (element *)malloc(s->capacity * sizeof(element));
}

int is_empty(stacktype *s)
{
	return (s->top == -1);
}

int is_full(stacktype *s)
{
	return (s->top == (s->capacity - 1));

}


void push(stacktype *s, element item)
{
	if (is_full(s)) {
		fprintf(stderr, "스택 공백 에러\n");
	}
	else s->data[++(s->top)] = item;
}

void pop(stacktype *s) {
	if (is_empty(s))
	{
		fprintf(stderr, "스택 공백 에러\n");
	}
	else s->data[--(s->top)];
}

int check_matching(stacktype *s, char *ch)
{
	int n;
	n = strlen(ch);
	char check_ch;

	for (int i = 0; i < n; i++)
	{
		check_ch = ch[i];

		switch (check_ch)
		{
		case '(': case '{': case '[':
			push(s, check_ch);
			break;
		case  ')': case '}': case ']':
			if (is_empty(s))
			{
				return 0;
			}
			else if ((s->data[s->top] == '(' && check_ch == ')') ||
				(s->data[s->top] == '{' && check_ch == '}') ||
				(s->data[s->top] = '[' && check_ch == ']'))
			{
				pop(s);
			}
		}
	}
	if (!is_empty(s)) return 0;
	return 1;
}
int main()
{
	char ch[30];
	stacktype stack_ch;

	scanf("%s", ch);
	init_stack(&stack_ch, strlen(ch));

	if (check_matching(&stack_ch, ch) == 1)
		printf("True\n");
	else if ((check_matching(&stack_ch, ch) == 0))
	{
		printf("False\n");
	}


	return 0;
}