

這道題要求我們判斷輸出的一個字串中的括號是否符合運算規律,可以運用堆疊的思想,如果一個括號是左括號就入堆疊,如果輸出一個右括號就將它和堆疊頭的左括號對比,符合就出堆疊(相當于消掉),最后如果還有沒消掉的括號就是不符合規定,
話不多說上代碼:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 1000
#define ok 1
#define error 0
typedef struct
{
char a[max];
int top;
}seq;
void InitStack(seq *s)//初始化
{
s->top=-1;
}
int Push(seq*s,char x)//元素入堆疊
{
if(s->top==max-1) return (error);
s->top++;
s->a[s->top]=x;
return (ok);
}
int Pop(seq *s,char* x)//元素出堆疊
{
if(s->top==-1) return(error);
else
{
*x=s->a[s->top] ;
s->top--;
return(ok);
}
}
int GetTop(seq*s,char*x)//將堆疊頂元素讀取到x中
{
if(s->top==-1) return (error);
else
{
*x=s->a[s->top];
return (ok);
}
}
int Match(char a,char b)//檢測兩個括號是否匹配
{
if((a=='('&&b==')')||(a=='['&&b==']')||(a=='{'&&b=='}')) return (ok);
else return 0;
}
int IsEmpty(seq *s)//檢測堆疊是否為空
{
if(s->top==-1) return (ok);
else return(error);
}
void BracketMatch(char *str)
{
seq s;int i;char ch;
InitStack(&s);
for(i=0;str[i]!='\0';i++)
{
switch(str[i])
{
case'(':
case'[':
case'{':
Push(&s,str[i]);break;//如果是前括號,就入堆疊
case')':
case']':
case'}':
if(IsEmpty(&s)) {printf("no");return;}//空表no右括號多余
else
{
GetTop(&s,&ch);
if(Match(ch,str[i])) Pop(&s,&ch);//匹配的括號消掉
else{printf("no");return;}//括號不同類
}
}
}
if(IsEmpty(&s)) printf("yes");
else printf("no");//左括號多余
}
int main()
{
char str[max];
scanf("%s",str);
BracketMatch(str);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274483.html
標籤:其他
