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
'▸C언어 > 알고리즘 및 자료구조' 카테고리의 다른 글
스택구조_후위표기식_수식 계산하기(괄호 포함 수식) [2/3] (0) | 2019.12.09 |
---|---|
스택구조_후위표기식_수식 계산하기(괄호 없는 수식) [1/3] (1) | 2019.12.09 |
연결리스트_일반 배열 vs 연결리스트 [3/3] (0) | 2019.12.09 |
연결리스트_다항식_코드 상세 [2/3] (0) | 2019.12.05 |
연결리스트_다항식_구현목표 및 전체코드 [1/3] (0) | 2019.12.05 |
댓글