问题描述
假设表达式中存在括号(各种括号),其嵌套的顺序随意,即([])
或[([][])]
等为正确的格式,[(])
或(())
均为不正确的格式。
思路
依次扫描所有字符,遇到左括号入栈,遇到右括号弹出栈顶元素是否匹配。
匹配失败的情况:
- 左括号单身。例:
()(
- 右括号单身。例:
())
- 左右括号不匹配。例:
(]
程序流程图(摘自b站王道考研)
代码
#include<stdio.h>
#define MaxSize 50 //定义栈中元素的最大个数
typedef struct{
char data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
//初始化栈
void InitStack(SqStack &S){
S.top = -1;
}
//判断栈是否为空
int StackEmpty(SqStack S){
if(S.top == -1)
return 1;
else
return 0;
}
//新元素入栈
int Push(SqStack &S, char x){
if(S.top == MaxSize-1)
return 0; //栈满,报错
S.data[++S.top] = x;
return 1;
}
//栈顶元素出栈,用x返回
int Pop(SqStack &S, char &x){
if(S.top == -1)
return 0; //栈空,报错
x = S.data[S.top--];
return 1;
}
//括号匹配
int 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 0; //匹配失败
}
char topElem;
Pop(S, topElem); //栈顶元素出栈
if(str[i]==')' && topElem!='(') return 0;
if(str[i]==']' && topElem!='[') return 0;
if(str[i]=='}' && topElem!='{') return 0;
}
}
return StackEmpty(S); //检索完全部括号后,栈空说明匹配成功
}
int main(){
//括号个数
int length;
scanf("%d",&length);
getchar();
//读取括号
char str[length];
for(int i=0; i<length; i++)
scanf("%c",&str[i]);
//测试是否匹配
if(bracketCheck(str,length) == 1)
printf("匹配成功");
else
printf("匹配失败");
return 0;
}
测试
测试1
测试2