▸C언어/알고리즘 및 자료구조

스택구조_괄호 수식 검증 [1/1]

코데방 2019. 12. 9.
728x90

해당 과제는 유투브 '권오흠'님의 자료구조 강의를 참조하였습니다.

닫힌 괄호는 가장 마지막에 나온 열린 괄호와 같은 유형이어야 한다라는 점만 유의하면 간단하게 작성할 수 있습니다. 어차피 스택과 같은 후입선출 개념을 사용할 수밖에 없습니다.

 

  • 열린 괄호가 나오면 해당 유형 번호를 배열에 순서대로 저장
  • 닫힌 괄호가 나오면 가장 마지막에 나온 열린 괄호와 유형이 같은지 확인 후, 해당 배열값을 제거
  • 해당 순서의 열린괄호와 다른 유형의 닫힌 괄호가 나오면 에러값 반환
  • 짝이 맞지 않아 배열의 값이 남거나 또는 모자랄 경우 에러값 반환

실제 엑셀과 같은 괄호 계산 식의 구현은 다음글들을 참조하시면 됩니다.

 

2019/12/09 - [C언어/알고리즘 및 자료구조] - 스택구조_후위표기식_수식 계산하기(괄호 없는 수식) [1/3]

2019/12/09 - [C언어/알고리즘 및 자료구조] - 스택구조_후위표기식_수식 계산하기(괄호 포함 수식) [2/3]

2019/12/09 - [C언어/알고리즘 및 자료구조] - 스택구조_후위표기식_수식 계산하기(수정/기능추가) [3/3]

 

#include <stdio.h>
#include <string.h>
#define LENGTH 50
int parenthesis(char* str);

int main()
{	
	char str[] = "[ ((2 + 3) * 5) - { 3 * 2 / (4 - 1) } ]";
	if (parenthesis(str) == -1)
		puts("괄호 표기가 잘못되었습니다.");
	else puts("괄호 표기가 정상입니다.");

}

int parenthesis(char* str)
{
	char OPEN[] = "([{";	// 유형 : 0,1,2
	char CLOSE[] = ")]}";	// 유형 : 0,1,2
	char parenthesis[LENGTH] = "";	
	int i = 0, j = 0, status = 0;
	char c;
	while ((c = str[j]) != '\0')
	{
		for (unsigned w = 0; w < strlen(OPEN); ++w)
			if (c == OPEN[w])  // 열린 괄호가 나왔을 때
			{
				parenthesis[i++] = w;  // 해당 유형을 배열에 입력
				status = 1;	
				break;
			}

		if (status != 1) 
        // 해당 문자가 열린 괄호일 경우 닫힌괄호 찾기를 수행할 필요가 없음
		{
			for (unsigned q = 0; q < strlen(CLOSE); ++q)
				if (c == CLOSE[q])  // 닫힌 괄호가 나왔을 때
				{
					if (i == 0)  // 열린 괄호가 0개라면 비정상
						return -1;

					else if (i > 0 && q == parenthesis[i - 1])
					{
						i--;  // 가장 최신 괄호와 유형이 같다면 최신 값을 제거
						break;
					}
					else return -1;  // 유형이 같지 않다면 비정상
				}
		}
		status = 0;
		j++;
	}
	
	if (i == 0) return i;  // 괄호가 순서대로 열고 닫혀 배열 갯수가 0개라면 정상
	else return -1;  // 없어도 되지만 비쥬얼 스튜디오에서 warning 떠서 추가
}
728x90

댓글

💲 추천 글