![在这里插入图片描述](https://img-blog.csdnimg.cn/55020f16a6b343e1bd0e84a104dd0a8e.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5byg5aSa6ZiU,size_20,color_FFFFFF,t_70,g_se,x_16
代码实现
//最后出现的左括号最先被匹配,用栈的特性,
//遇到左括号就入栈,遇到右括号就消耗一个左括号
//
//
//1、左与右不匹配
//2、右括号存在,但是栈内没有元素与之对应,
//3、匹配完成后栈内还有元素
//算法实现
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 10
typedef struct stack{
char data[Maxsize];
int top;
}Stack;
/*
以下为栈的基本操作
*/
bool IsFull(Stack &s){
if(s.top+1 == Maxsize){
return true;
}
return false;
}
bool Isempty(Stack &s){
if(s.top == -1){
return true;
}
return false;
}
void InitStack(Stack &s){
s.top = -1;
}
bool PushStack(Stack &s,char data){
if(IsFull(s)){
return false;
}
s.data[++s.top] = data;
return true;
}
bool PopStack(Stack &s,char &x){
if (Isempty(s))
{
return false;
}
x = s.data[s.top--];
return true;
}
bool GetTop(Stack &s,char &x){
if(Isempty(s)){
return false;
}
x = s.data[s.top];
return true;
}
int length(char str[]){
int length = 0;
int i = 0;
while(str[i] != '\0'){
i++;
length++;
}
return length;
}
/*
name : ParenMatch()
role : 括号是否匹配,正确返回true,else 返回false
*/
bool ParenMatch(Stack &s,char str[]){
int len = length(str);
for(int i =0;i<len;i++){
if(str[i] == '(' || str[i] == '['|| str[i] == '{'){ //左括号,入栈
PushStack(s,str[i]);
}else{ //扫描到右括号
if(Isempty(s)){ //为空,匹配失败
return false;
}
char elem;
PopStack(s,elem);
if(str[i] == ')' && elem != '(' ){
return false;
}
if(str[i] == ']' && elem != '[' ){
return false;
}
if(str[i] == '}' && elem != '{' ){
return false;
}
}
}
// if(Isempty(s)){
// return true;
// }else{
// return false;
// }
return Isempty(s); //与上边if else表达的一样
}
int main(){
Stack s;
InitStack(s);
char str[10] = {'(','(','{','}',')',')','(',')'};
// int len = length(str);
// printf("%d",len);
if(ParenMatch(s,str)){
printf("true");
}else{
printf("false");
}
}