关于括号匹配问题!
/*
括号匹配问题。
思想:括号分为(,[,],)四种。当遇见左括号时将其压入栈,当遇见右括号时有两种情况。
第一种是该右括号与栈顶的括号想匹配。第二种是该括号不合法,就是括号不匹配。开始时,
栈为空,当一对括号发生匹配时,将左括号取出。所以结束时,栈也为空。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define InitSize 100 //定义初始存储空间大小
#define Size 100 //定义新增存储空间的大小
#define MAX 100
//定义结构体
typedef struct Stack
{
int* top;
int* base;
int stacksize;
}SqStack;
//建立一个空栈
void InitStack(SqStack *s)
{
s->base = (int *)malloc(InitSize * sizeof(int));
if(!s->base) printf("分配失败!\n");
s->top = s->base;
s->stacksize = InitSize;
}
//入栈
void Push(SqStack *s, int e)
{
if(s->top - s->base >= s->stacksize)
{
s->base = (int *) realloc (s->base, (s->stacksize+Size)*sizeof(int));
s->top = s->base + s->stacksize;
s->stacksize += Size;
}
*(s->top) = e;
s->top++;
}
//取栈顶元素
int getTop(SqStack *s)
{
int e;
if(s->base == s->top)
{
return 0;
}
e = *(s->top-1);
return e;
}
//删除栈顶元素
int Pop(SqStack *s)
{
//int e;
if(s->top == s->base)
{
return 0;
}
s->top --;
//e = *(--s->top);
//return e;
}
int main()
{
//使用字符数组来定义字符串,用strlen来求字符串的长度
char str[MAX];
int i, e;
SqStack s; //定义结构体变量
printf("请输入要检测的括号对:");
scanf("%s", str);
InitStack(&s);
for(i=0; i<strlen(str); i++)
{
if(str[0] ==')' || str[0]==']')
{
printf("括号不匹配!");
break;
}
if(str[i] == '(' ||str[i] == '[') Push(&s,str[i]);
else if(str[i] ==')' || str[i]==']')
{
e = getTop(&s);
//printf("%c", e);
if(e != 0)
{
if(e == '(' && str[i] ==')')
{
Pop(&s);
}
else if(e == '[' && str[i] ==']')
{
Pop(&s);
}
else
{
printf("括号不匹配!\n");
break;
}
}
}
else
{
printf("输入错误!");
break;
}
}
//printf("%d,%d", i,strlen(str)-1);
//这里i的值,要分清for循环执行完后,i的值。
if(getTop(&s)==0 && i==strlen(str) && i) printf("括号匹配!\n");
return 0;
}