本文代码为学习总结,如果错误敬请指正!感谢各位大佬 😃
历史文章
用栈实现括号匹配:
依次扫描所有字符,遇到左括号入栈,遇到右括号则弹出栈顶元素检查是否匹配
匹配失败:
①左括号单身
②右括号单身
③左右括号不匹配
算法实现:
#include<stdlib.h>
#include<stdio.h>
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
char data[MaxSize];//静态数组存放栈中元素
int top;//栈顶指针
}SqStack;
//初始化栈
void InitStack(SqStack &S){
S.top=-1;//初始化栈顶指针
}
//判断栈是否为空
bool StackEmpty(SqStack S){
if(S.top==-1){//空
return true;
}else{
return false;
}
}
//新元素入栈
bool Push(SqStack &S,char x){
if(S.top==MaxSize-1){//栈满
return false;
}
S.top++;//栈顶指针+1
S.data[S.top]=x;//入栈
return true;
}
//栈顶元素出栈,用x返回
bool Pop(SqStack &S,char &x){
if(S.top==-1){
return false;
}
x=S.data[S.top];//读取元素 ,出栈
S.top--;// 指针-1
return true;
}
//括号匹配
bool bracketCheck(char str[],int length){
SqStack S;
InitStack(S);
for(int i=0;i<length;i++){
if(str[i]=='(' || str[i]=='[' || str[i]=='{'){//扫描到左括号
Push(S,str[i]);//左括号入栈
}else{//扫描到右括号
if(StackEmpty(S)){//如果栈空
return false;//匹配失败
}
char topElem;
Pop(S,topElem);//栈顶元素出栈
if(str[i]==')' && topElem!='('){
return false;
}
if(str[i]==']' && topElem!='['){
return false;
}
if(str[i]=='}' && topElem!='{'){
return false;
}
}
}
return StackEmpty(S);//检索万全部括号后,如果为空则匹配成功
}
int main(){
char str[100],s;
int len=0;
printf("请输入字符串(由\"()[]{}\"中的一个或多个组成):");
// scanf("%s", str);
// printf("输入的字符串为:%s", str);
scanf("%c",&s);
while(s!='#'){//输入#表示结束
str[len]=s;
len++;
scanf("%c",&s);
}
printf("输入的字符串为:%s,长度为%d", str,len);
if(bracketCheck(str,len)){
printf("匹配成功!");
}else{
printf("匹配失败!");
}
}