- 设表达式中包含三种括号:圆括号、花括号和方括号,它们可以互相嵌套。
- 检验算法中可设置一个栈,每读入一个括号,若是左括号,则直接入栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶的左括号同类型,则二者匹配,将栈顶的左括号出栈,否则属于不合法的情况,另外,如果输入序列已读完,而栈中仍有等待匹配的左括号,或者读入了一个右括号,而栈中已无等待匹配的同类型左括号,均属不合法情况。当输入序列和栈同时变为空时,说明所有括号完全匹配。
- 程序代码如下:
#include<stdio.h>
#include<stdlib.h>
#define size 10
typedef char StackElemType;
typedef struct
{
StackElemType elem[size];
int top;
}SeqStack;
void InitStack (SeqStack *S)
{ //构造一个空栈
S->top=-1;
}
int Push(SeqStack * S,StackElemType x) //顺序栈进栈运算
{
if(S->top==size-1)
{
return 0; //栈已满
}
S->top++; //修改栈顶指针
S->elem[S->top]=x; //x进栈
return 1;
}
int Pop(SeqStack * S,StackElemType * x) //顺序栈出栈运算
{ //将S栈顶元素弹出,放到x所指向的存储空间中带出
if(S->top==-1) //栈为空
{
return 0;
}
else
{
* x=S->elem[S->top]; //栈顶元素赋给x
S->top--;
return 1;
}
}
int GetTop(SeqStack * S,StackElemType * x) //顺序栈读栈顶元素
{
if(S->top==-1)
{
return 0;
}
else
{
* x=S->elem[S->top];
return 1;
}
}
int Match(char ch,char str) //判断两个括号是否匹配
{
if((ch=='['&&str==']')||(ch=='{'&&str=='}')||ch=='('&&str==')')
{
return 1;
}
else
{
return 0;
}
}
int IsEmpty(SeqStack * S) //判空
{
if( S->top==-1)
{
return 1;
}
else
{
return 0;
}
}
void BracketMatch(char *str)
{
SeqStack 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("\n右括号多余!");
return;
}
else
{
GetTop(&S,&ch);
if(Match(ch,str[i])) //用Match判断两个括号是否匹配
{
Pop(&S,&ch); //已匹配的左括号出栈
}
else
{
printf("\n对应的右括号不同类!");
return;
}
}
}
}
if(IsEmpty(&S))
{
printf("\n括号匹配!");
}
else
{
printf("\n左括号多余\n");
}
}
int main()
{
char str[10];
printf("请输入字符串:\n");
scanf("%s",str);
BracketMatch(str);
printf("\n");
return 0;
}
运行结果如下: