#include<stdio.h>
#include<conio.h>
#define MAX 80
struct stack {char items[MAX]; int top;};
int leftbracket(char x) { return((x=='(')||(x=='{')||(x=='[')); }
int rightbracket(char x) { return((x==')')||(x=='}')||(x==']')); }
int match(char ch, char top)
{
 switch (ch)
	   { case ')': return (top=='(');
	     case '}': return (top=='{');
	     case ']': return (top=='[');
	     default : return 0;
	   }
}
void push(struct stack *s, char x) {  s->items[++s->top]=x;};
int isstackfull(struct stack s) { return(s.top==MAX-1);};
void pop(struct stack *s,char *x) { *x=s->items[s->top--]; };
isstackempty(struct stack s) {return (s.top==-1);};

void main()
{
 struct stack s;
 int i,matched=-1;
 char a[80],c,t;
 clrscr();
 s.top=-1;
 printf("\nEnter expression:"); gets(a);
 for(i=0;a[i]!='\0';i++)
 {
  c=a[i];
  if(leftbracket(c))
  {
   if(!isstackfull(s)) push(&s,c);
  }
  else
   if (rightbracket(c)) {if(!isstackempty(s)) pop(&s,&t);}
   if (!match(c,t)) { matched=0; break;}
 }
 if(s.top!=-1) matched=0;
  if(matched)
 printf("\nWell defined");
 else
 printf("\nNot well defined");
 getch();
}


