NYOJ 2 괄호 짝 짓 기 문제 (데이터 구조)
시간 제한:
3000 ms | 메모리 제한:
65535 KB
난이도:
3
묘사 하 다.
현재 괄호 서열 이 있 습 니 다. 이 괄호 가 맞 는 지 확인 하 십시오.
입력
첫 번 째 줄 에 N (0 < N < = 100) 을 입력 하면 N 조 테스트 데이터 가 있 음 을 표시 합 니 다.다음 N 줄 에 여러 개의 입력 데 이 터 를 입력 합 니 다. 각 그룹의 입력 데 이 터 는 하나의 문자열 S (S 의 길 이 는 10000 이하 이 고 S 는 빈 문자열 이 아 닙 니 다) 입 니 다. 테스트 데이터 그룹 수 는 5 그룹 보다 적 습 니 다. 데이터 보증 S 에는 "["] "," (")" 네 가지 문자 만 포함 되 어 있 습 니 다.
출력
각 그룹의 입력 데이터 의 출력 이 한 줄 을 차지 합 니 다. 이 문자열 에 포 함 된 괄호 가 짝 을 이 루 면 Yes 를 출력 하고, 짝 을 이 루 지 않 으 면 No 를 출력 합 니 다.
샘플 입력
3
[(])
(])
([[]()])
샘플 출력
No
No
Yes
근원
네트워크
업로드 자
naonao
원리: 기대 의 급박 도
1. 데이터 구조 책 에 있 는 것 을 보면 귀찮아 서 추천 하지 않 습 니 다.
#include<stdio.h>
#include<stdlib.h>
typedef struct{
char m[10000];
int last;
}Seqlist;
void Inlist(Seqlist *L){
L->last=-1;} //
void push(Seqlist *L,char num){
L->m[++(L->last)]=num;} //
void pop(Seqlist *L,char *num){
*num=L->m[L->last];
L->last--;
} //
int isempty(Seqlist *L){
return (L->last==-1?1:0);
} // yes or no
int main()
{
char tem,t;
char *tt=&t;
int i,ll[5],k=-1,h,flag=1; //i ll[5] yes no
Seqlist L; // L
Inlist(&L); ////
scanf("%d",&i); //
if(i>5)
return 0; // 5
while(i-->0)
{
flag=1;
while(L.last!=-1)
pop(&L,tt);
fflush(stdin); //
while((tem=getchar())!='
')
{
if(isempty(&L))
{
if(tem!='('&&tem!='[')
{
ll[++k]=0;
flag=0;break;
}
else
push(&L,tem);
}//empty
else if(tem==')')
{
pop(&L,tt);
if(*tt!='(')
{
ll[++k]=0;
flag=0;break;
}
}
else if(tem==']')
{
pop(&L,tt);
if(*tt!='[')
{
ll[++k]=0;
flag=0;break;
}
}
else if(tem=='['||tem=='(')
push(&L,tem);
}//while1
if(flag)
{
if(isempty(&L))
ll[++k]=1;
else ll[++k]=0;
}
}
for( h=0;h<=k;h++)
{
if(ll[h]==0)printf("No
");
if(ll[h]==1) printf("Yes
");
}
return 0;
}
2. 생각 이 생기 면 다시 3 을 보 러 간다.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char a[10100],b[10100];
int n,len,i,top;
scanf("%d",&n);
while(n--)
{
scanf("%s",a);
len=strlen(a);
top=1;
b[0]=a[0]; //
for(i=1;i<len;i++) //i 1
{
if(a[i]=='('||a[i]=='[')
b[top++]=a[i];//
if(a[i]==')')
{
if(b[top-1]=='(') // !!!
top--;//
else
b[top++]=a[i];
}
if(a[i]==']') //
{
if(b[top-1]=='[')
top--;
else
b[top++]=a[i];
}
}
if(top==0) // ,
printf("Yes
");
else
printf("No
");
}
return 0;
}
3. 코드 간소화:
#include<stdio.h>
#include<string.h>
int main(){
int n,i,flag;
char a[10005];
scanf("%d
",&n);
while(n--){
flag=1;
memset(a,0,sizeof(a));
scanf("%c",&a[0]);
i=1;
while(scanf("%c",&a[i])&&(a[i]=='['||a[i]==']'||a[i]=='('||a[i]==')' ) ){//
if(a[i]==']')
if(a[i-1]=='[') i-=2;// , , ,
else flag=0; // ,No
if(a[i]==')')
if(a[i-1]=='(') i-=2; // , , ,
else flag=0; // ,No
i++;// ‘[ ’ ‘( ’ ,
}
if(flag==1&&i==0) printf("Yes
");// , Yes
else printf("No
");// No
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.