在四则运算表达式中,可以包含圆括号和方括号,而且还允许他们嵌套出现。试编写一个算法实现括号匹配 用c语言实现
时间: 2023-05-27 12:03:54 浏览: 184
算法思路:
使用栈来解决括号匹配的问题。
从左到右扫描表达式中的每个字符,当遇到左括号时,将其压入栈中;当遇到右括号时,判断栈顶的左括号是否与之匹配,如果匹配,则弹出栈顶元素;否则,表达式括号不匹配。扫描完整个表达式后,如果栈为空,则表明括号匹配;否则,表明括号不匹配。
代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
typedef struct Stack //栈的数据结构
{
char data[MAXSIZE];
int top;
}Stack;
void initStack(Stack *S); //初始化栈
int push(Stack *S,char a); //入栈
char pop(Stack *S); //出栈
int is_empty(Stack *S); //判断栈是否为空
int match(char a,char b); //判断括号是否匹配
int bracket_match(char exp[]); //括号匹配主函数
void initStack(Stack *S) //初始化栈
{
S->top=-1;
}
int push(Stack *S,char a) //入栈
{
if(S->top==MAXSIZE-1)
{
printf("Stack is full!\n");
return 0;
}
else
{
S->top++;
S->data[S->top]=a;
return 1;
}
}
char pop(Stack *S) //出栈
{
char temp;
if(is_empty(S))
{
printf("Stack is empty!\n");
return -1;
}
else
{
temp=S->data[S->top];
S->top--;
return temp;
}
}
int is_empty(Stack *S) //判断栈是否为空
{
if(S->top==-1)
return 1;
else
return 0;
}
int match(char a,char b) //判断括号是否匹配
{
if((a=='('&&b==')')||(a=='['&&b==']'))
return 1;
else
return 0;
}
int bracket_match(char exp[]) //括号匹配主函数
{
int i;
char temp;
Stack S;
initStack(&S); //初始化栈
for(i=0;exp[i]!='\0';i++) //扫描字符
{
if(exp[i]=='('||exp[i]=='[') //左括号入栈
push(&S,exp[i]);
else if(exp[i]==')'||exp[i]==']') //右括号
{
if(is_empty(&S)) //如果没有左括号与之匹配
return 0;
else
{
temp=pop(&S); //取出左括号
if(!match(temp,exp[i])) //判断括号是否匹配
return 0;
}
}
}
if(is_empty(&S)) //扫描完所有字符,如果栈为空,则括号匹配
return 1;
else
return 0;
}
int main()
{
char exp[MAXSIZE];
printf("Please enter the expression:");
gets(exp);
if(bracket_match(exp))
printf("Bracket match!\n");
else
printf("Bracket not match!\n");
return 0;
}
阅读全文