设表达式中包含三种括号:圆括号,方括号和花括号,他们可相互嵌套。如(【{}】(【】))或({【】【()】})等均为正确的格式,而{}【】})},{}【()】或(【】}均为不正确的格式。
算法思想
检验算法中可是设置一个栈,每读入一个括号,若是左括号,则直接入栈。等待相匹配的同类右括号,若读入的是右括号,且与当前栈顶的左括号同类型,则二者匹配,将栈顶的左括号出栈,否则属于不合法的情况。另外,如果输入序列以读完,而栈中仍有等待匹配的左括号,或者读入了一个右括号,而栈中已无等待匹配的同类左括号,均属不合法的情况。当输入序列和栈同时为空时,说明所有的括号完全匹配。
算法描述
#include<iostream>
using namespace std;
typedef char StackElementType;//栈数据类型
typedef struct StackNode{
StackElementType data; // 数据
StackNode *next; //指针
}LinkStackNode,*LinkStack;
//定义一个运算符数组集合
StackElementType Str[]={"{([{()}])}"};//一个含括号的字符串
/*
{(} 左右括号不匹配 ()}右括号多余
{() 左括号多余 {([{()}])}括号匹配
*/
//初始化栈
void initStack(LinkStack &top){
LinkStack p;
p = (LinkStack)malloc(sizeof(LinkStackNode));//申请一个空间作为头结点
top = p; //头指针指向头结点
p->next = NULL; //空栈
}
//操作:进栈
bool push(LinkStack &top,StackElementType data){
LinkStack p;
p = (LinkStack)malloc(sizeof(LinkStackNode));//申请一个栈的空间
if(p == NULL)
return false; //申请空间失败
//申请成功
p->data = data; //在申请的空间中放入一个数据
p->next = top;// 压栈
top = p;//top指向栈顶
return true;
}
//出栈并返回出栈的值
bool pop(LinkStack &top,StackElementType &data){
LinkStack p;
p = top; //p为栈顶
if(p->next== NULL) //栈为空
return false;
//栈不为空
top = p->next;//栈顶往下移一个
data = p->data;//p就为栈顶 ,要出栈的数据
free(p);//释放栈顶的空间
return true;
}
//获取栈顶的元素,不改变原来栈的信息
StackElementType getTop(LinkStack top){
return top->data;//返回栈顶元素
}
//判段一个栈是否是空栈
bool isEmpty(LinkStack S){
if(S->next==NULL)//空栈
return 1;
else
return 0;
}
//判断两个括号是否匹配
bool match(StackElementType a,StackElementType b){
switch(a){
case '(':if(b==')')return 1;break;
case '[':if(b==']')return 1;break;
case '{':if(b=='}')return 1;break;
}
return 0;
}
//括号匹配算法
void brackMatch(char *str){
LinkStack S;//定义一个S栈
int i=0;
StackElementType ch;
initStack(S);//初始化栈
while(str[i]!='\0'){
// cout << str[i];
switch(str[i]){
case '(':
case '[':
case '{':
push(S,str[i]);//把左边括号压入栈
break;
case ')':
case ']':
case '}':
if(isEmpty(S)){
cout << "右括号多余!";
return ;
}
else { //不是空栈
ch = getTop(S);//获取栈顶元素
if(match(ch,str[i]))//用match判断两个括号是否匹配
pop(S,ch);//已匹配的左括号出栈
else {
cout << "对应的左右括号不同类!" ;
return ;
}
}
break;
}
i++;
}
if(isEmpty(S))//看是不是空栈
cout << "括号匹配!";
else
cout << "左括号多余" ;
}
//main函数,程序的入口地址
void main(){
brackMatch(Str);
}