表达式中允许的括号包括( ,[ ,{ ,英文输入法下。其嵌套的顺序任意,([])或{([])}等为正确匹配的格式,{()]或(((}}})))为不能匹配的格式。
算法的思想如下:
1. 初始定义一个空栈,顺序读入括号
2. 若是左括号,左括号进栈,若是右括号,将栈顶元素与其匹配,不匹配直接返回false(此时如果栈是空的也返回false),匹配则继续读入括号,直至读完。
3. 算法结束是,如果栈空,则括号能正确匹配,否则不能。
具体代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 10
typedef char Ele;
typedef struct Stack{
Ele data[max];
int top;
}Stack;
void InitStack(Stack &S){
S.top=-1;
}
bool StackEmpty(Stack S){
if(S.top==-1) return true;
else return false;
}
bool Push(Stack &S,Ele e){
if(S.top==max-1) return false;
S.data[++S.top]=e;
return true;
}
bool Pop(Stack &S,Ele &e){
if(StackEmpty(S)) return false;
e=S.data[S.top--]; return true;
}
bool Match(char a[],int length){
Stack S;//定义一个栈
InitStack(S);//栈的初始化
for(int i=0;i<length;i++){
if(a[i]=='('||a[i]=='['||a[i]=='{'){//左括号入栈
Push(S,a[i]);
}
else{
if(StackEmpty(S))
return false;// 右括号且栈空,左右括号不匹配,返回false
char topEle;//用来存放栈顶元素
Pop(S,topEle);
if(a[i]==')' && topEle!='(') return false;//如果括号不匹配,返回false
if(a[i]==']' && topEle!='[') return false;
if(a[i]=='}' && topEle!='{') return false;
}
}
return StackEmpty(S);
}
int main(){
int n;
scanf("%d\n",&n);//!!!!此处一定要加\n,不然会在输入的时候把\n 读进字符数组!!!!!!!
char a[n];
for(int i=0;i<n;i++){
scanf("%c",&a[i]);
}
if(Match(a,n)) printf("括号匹配!\n");
else printf("括号不匹配!\n");
}