취미 알고리즘 - 괄호 일치
스 택 으로 괄호 정 보 를 저장 하고 왼쪽 괄호 를 만 나 스 택 에 들 어가 면 오른쪽 을 만 나 스 택 꼭대기 의 괄호 와 일치 하여 스 택 에서 문자열 을 계속 검색 합 니 다.
#include <stdio.h>
#include <stdlib.h>
// using stack to save and judge the string
// return the index where the bracket not match
// return 0 no problem
int IsMatch(char* strTest, int nLen)
{
char* pStack = NULL;
char* pChr = strTest;
int i = 0;
int nStackIdx = 0;
if ((pChr == NULL) || (nLen == 0))
{
return -1;
}
pStack = (char*) malloc(sizeof(char)*nLen);
if (pStack == NULL)
{
return -1;
}
while (i < nLen)
{
switch(*pChr)
{
case '{':
case '[':
case '(':
case '<':
pStack[nStackIdx] = *pChr;
nStackIdx++;
break;
case '}':
if ((nStackIdx > 0) && (pStack[nStackIdx-1] == '{'))
{
nStackIdx--;
}
else
{
printf("Miss mathc } at %d
", i+1);
return i+1;
}
break;
case ']':
if ((nStackIdx > 0) && (pStack[nStackIdx-1] == '['))
{
nStackIdx--;
}
else
{
printf("Miss mathc ] at %d
", i+1);
return i+1;
}
break;
case ')':
if ((nStackIdx > 0) && (pStack[nStackIdx-1] == '('))
{
nStackIdx--;
}
else
{
printf("Miss match ) at %d
", i+1);
return i;
}
break;
case '>':
if ((nStackIdx > 0) && (pStack[nStackIdx-1] == '<'))
{
nStackIdx--;
}
else
{
printf("Miss match > at %d
", i+1);
return i;
}
break;
default:
break;
}
i++;
pChr++;
}
if (nStackIdx == 0)
printf("The string: %s is ok
", strTest);
else
printf("The string is not bracket match: missing %c at %d
",
pStack[nStackIdx-1], nStackIdx);
free(pStack);
return nStackIdx;
}
int main()
{
char sTestOk[] = "{<[<<{{{[<<>>[[]]]}}}>>]>}";
char sTestFail[] = "{";
char sTestFail1[] = "<<{[(asdfe]]}>>";
int i = 0;
IsMatch(sTestOk, strlen(sTestOk));
IsMatch(sTestFail, strlen(sTestFail));
IsMatch(sTestFail1, strlen(sTestFail1));
scanf("%d", &i);
return 0;
}
알고리즘 복잡 도 분석:
시간 복잡 도: O (n), 한 번 스 캔 하면 문자열 이 일치 하 는 지 확인 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.