stack.h
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define list_init_size 100
#define listincrement 10
typedef int status;
typedef struct stack
{
int *top;
int *base;
int stacksize;
} Stack;
void initlist(Stack *s);
status stackempty(Stack s);
void push(Stack *s,int e);
void pop(Stack *s,int *e);
stack.c
#include "stack.h"
int main()
{
char ch[100];
char *p;
int e = 0;
Stack s;
initlist(&s);
p = ch;
gets(ch);
while(*p)
{
switch(*p)
{
case '{':
case '[':
case '(':
push(&s,*p++);
break;
case ')':
case ']':
case '}':
pop(&s,&e);
if((*p == '}' && e == '{') || (*p == ')' && e == '(') || (*p == ']' && e == '['))
{
p++;
}
else
{
printf("it is eror");
exit(OVERFLOW);
}
break;
default:
break;
}
}
if(stackempty(s))
printf("it is ok!");
else
printf("it is error");
return 0;
}
void initlist(Stack *s)
{
s->base = (int *)malloc(list_init_size * sizeof(int));
if(!s->base)
exit(OVERFLOW);
s->top = s->base;
s->stacksize = list_init_size;
}
status stackempty(Stack s)
{
if(s.top == s.base)
return 1;
else
return 0;
}
void push(Stack *s,int e)
{
if(s->top - s->base >= s->stacksize)
{
s->base = (int *)realloc(s->base,(s->stacksize +listincrement)*sizeof(int));
if(!s->base)
exit(OVERFLOW);
s->top = s->base + s->stacksize;
s->stacksize += listincrement;
}
*s->top = e;
s->top++;
}
void pop(Stack *s,int *e)
{
if(s->top == s->base)
printf("stack is empty");
else
*e = *(--s->top);
}