根据栈的先进后出特点
将遇到的左括号依次压入栈中
遇到右括号时取出栈顶元素(退栈处理)
比较栈顶元素和输入的括号是否想匹配
注意
1.判断的字符串流的奇偶性
2.注意输入的字符是否为所需的括号字符
3.考虑栈的栈顶和栈底是否溢出
4.栈在开始和结束时都应该是空的.所以匹配到最后还要判断栈是否为空,若非空,则匹配失败
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max_size 100
typedef struct
{
char data[max_size];
int top;
}stack;
//初始化栈
void Init(stack *s)
{
s = (stack *)malloc(sizeof(stack));
s -> top = -1;
}
//进栈
int push(stack *s,char n)
{
if(s -> top == max_size - 1)
return 0;
s -> top ++;
s -> data[s -> top] = n;
return 1;
}
//出栈
int pop(stack *s,char *n)
{
if(s -> top == -1)
return 0;
*n = s -> data[s -> top];
s -> top --;
return 1;
}
//判断栈是否为空
int empty(stack *s)
{
return (s -> top == -1);
}
//取栈顶
int get_top(stack *s,char *n)
{
if(s -> top == -1)
return 0;
*n = s -> data[s -> top];
}
//括号匹配
int match(stack *s,char *string)
{
// printf("%s",string); 括号数据流
int flag = 0,i = 0;//flag == 1不匹配
char n;
while(i < strlen(string) && strlen(string) % 2 == 0)
{
switch(string[i])
{
case '(': case '[': case '{':
push(s,string[i]);
get_top(s,&n);
//printf("\n%c\n",n);
break;
case ')': pop(s,&n);
if(n != '(')flag=1;
//printf("\n%c\n",n);
break;
case ']': pop(s,&n);
if(n != '[')flag=1;
//printf("\n%c\n",n);
break;
case '}': pop(s,&n);
if(n != '{')flag=1;
//printf("\n%c\n",n);
break;
default: flag=1;
break;
}
if(flag)break;
i++;
}
if(flag == 0 && empty(s) == 0 && strlen(string) % 2 == 0)
printf("括号匹配成功!\n");
else
printf("括号匹配失败!\n");
}
int main()
{
stack s;
Init(&s); //初始化
char string[max_size];
scanf("%s",string);
match(&s,string);
return 0;
}