用顺序栈实现括号匹配:
依次扫描所有字符,遇到左括号则入栈,遇到右括号则弹出栈顶元素检查是否匹配。
匹配失败的情况:
1)左括号单身
2)右括号单身
3)左右括号都不匹配
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define maxsize 10
typedef struct {
char data[maxsize];
int top;
}stack;
//栈的初始化
void initstack(stack &s)
{
s.top=-1;
}
//栈的判空
bool empty(stack s)
{
if(s.top==-1)
return true;
else
return false;
}
bool pushstack(stack& s,char x)
{
if(s.top==maxsize-1)
return false;
s.top++;
s.data[s.top]=x;
return true;
}
bool popstack(stack& s, char & x)
{
if(s.top==-1)
return false;
x=s.data[s.top];
s.top--;
return true;
}
bool gettop(stack s, char & x)
{
if(s.top==-1)
return false;
x=s.data[s.top];
return true;
}
bool bracketcheck(char* c)
{
stack s;
initstack(s);
int len;
for(len=0;c[len]!='\0';len++); //计算字符串长度
for (int i = 0; i < len; i++) {
if (c[i] == '(' || c[i] == '{' || c[i] == '[') {//如果是左括号入栈
pushstack(s,c[i]);
}
else {
if(empty(s))//如果是右括号且此时栈空,说明栈中没有左括号与其匹配
return false;
char topelem;
popstack(s,topelem);//如果是右括号且此时栈不空,看左右括号是否匹配
if(c[i]==')'&&topelem!='(')
return false;
if(c[i]=='}'&&topelem!='{')
return false;
if(c[i]==']'&&topelem!='[')
return false;
}
}
if(empty(s))//所有的字符扫描完,且此时的栈为空,说明括号匹配成功
return true;
else
return false; //如果栈不空,说明有左括号没有被匹配
}
int main()
{
char word[]="{(())[]}}";
if (bracketcheck(word)) {
printf("匹配成功!\n");
}
else {
printf("匹配失败!\n");
}
return 0;
}