常常在运算表达式中用各种括号的存在,可怎么判断括号是否合法呢?
如[()]() 就是合法的 而(()(])就是不合法的
假设用户先输入([(则后面必须先检测有无)与第三个相匹配,
再检测有无]与第二个相匹配,再检测有无)与第一个相匹配与堆栈后进先出的特点相匹配
我的思路如下出现一个[就向堆栈中压入1
出现一个(就向堆栈中压入2
而出现一个]就从堆栈中弹出一个数并检查是否为1
出现一个)就从堆栈中弹出一个数并检查是否为2
#include <stdio.h>
#include <malloc.h>
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
#define SElemtype int
#define MAXINPUT 100
#define symbol1 1
#define symbol2 2
typedef struct
{
SElemtype *top;
SElemtype *base;
int stacksize;
}SqStack;
typedef enum
{
OK,
ERROR
}Status;
int InitStack(SqStack *s)
{
s->base=(SElemtype *)malloc(STACK_INIT_SIZE*sizeof(SElemtype));
if(!s->base)
return ERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
int Push(SqStack *s,SElemtype item)
{
if(s->top-s->base>=s->stacksize)//如果堆栈已满就增加空间
{
s->base=(SElemtype*)realloc(s->base,(s->stacksize+STACK_INCREMENT)*sizeof(SElemtype));
if(!s->base)
{
return ERROR;
}
s->stacksize+=STACK_INCREMENT;
}
*s->top=item;
s->top++;
return OK;
}
int Pop(SqStack *s,SElemtype *item)
{
if(s->base==s->top)//堆栈为空
{
return ERROR;
}
s->top--;
*item=*s->top;
return OK;
}
int Gettop(SqStack *s,SElemtype *item)
{
if(s->base==s->top)//堆栈为空
{
return ERROR;
}
*item=*(--(s->top));
s->top++;
return OK;
}
int compare(char* input)
{
SqStack s;
InitStack(&s);
int tmp;
while(*input)
{
if(*input=='[')
Push(&s,symbol1);
else if(*input=='(')
Push(&s,symbol2);
else if(*input==']')
{
if(Pop(&s,&tmp)==ERROR)//如果堆栈中没有与之对应的符号了返回错误
return ERROR;
if(tmp!=symbol1)//如果弹出的符号与当前输入的符号不相对应的话返回错误
return ERROR;
}
else if(*input==')')
{
if(Pop(&s,&tmp)==ERROR)//如果堆栈中没有与之对应的符号了返回错误
return ERROR;
if(tmp!=symbol2)//如果弹出的符号与当前输入的符号不相对应的话返回错误
return ERROR;
}
input++;
}
if(Pop(&s,&tmp)==ERROR)
return OK;
else
return ERROR;
}
int main(int argc,char *argv)
{
char input[MAXINPUT];
printf("Please input the symbol\n");
gets(&input);
if(compare(&input)==OK)
printf("The symbol is ok\n");
else
printf("The symbol is error\n");
return EXIT_SUCCESS;
}