#include<stdlib.h>
#include<stdio.h>
#define STACK_LIST_SIZE 100
#define STACKINCREMENT 10
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int status;
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
status InitStack(SqStack &S)
{
S.base = (char*)malloc(STACK_LIST_SIZE*sizeof(char));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_LIST_SIZE;
return OK;
}
status StackEmpty(SqStack S)
{
if (!S.base) exit(OVERFLOW);
if (S.base == S.top) return TRUE;
else return FALSE;
}
status Push(SqStack &S, char c)
{
if (!S.base) exit(OVERFLOW);
if (S.stacksize >= STACK_LIST_SIZE) {
S.base = (char*)realloc(S.base,(STACKINCREMENT+STACKINCREMENT)*sizeof(char));
if (!S.base) exit(OVERFLOW);
S.top = S.base + S.stacksize;
}
*(S.top) = c;
S.top++;
S.stacksize++;
return OK;
}
status Pop(SqStack &S, char &c)
{
if (!S.base) exit(OVERFLOW);
if (S.base == S.top) return ERROR;
c = *(S.top - 1);
S.top--;
return OK;
}
status match(char *pexp)
{
SqStack S;
InitStack(S);
int b = 1;
int i = 0;
char c;
while (b == 1 && pexp[i] != '\0')
{
if (pexp[i] == '(') Push(S, pexp[i]);
else if (pexp[i] == ')')
{
if (StackEmpty(S)) return ERROR;
else
{
Pop(S, c);
if (c != '(') b = 0;
}
}
i++;
}
return (b&&StackEmpty(S));
}
int main()
{
char exp[MAXSIZE];
printf_s("Please input the expression(<=100):");
gets_s(exp);
puts(exp);
if (match(exp)) printf("匹配正确\n");
else printf("匹配错误\n");
system("pause");
return 0;
}