#include <string.h>
#include <map>
#include <list>
#include <conio.h>
using namespace std;
#define MAX_STRING_ELMENT_VALUE 255
void main()
{
//ilegal operator/bracket combinations
// std::map<char,char> disallowedcomb;
char disallowedcomb[MAX_STRING_ELMENT_VALUE][MAX_STRING_ELMENT_VALUE]; //better use a map to save space
memset(disallowedcomb,0,sizeof(char)*MAX_STRING_ELMENT_VALUE*MAX_STRING_ELMENT_VALUE);
disallowedcomb['+'][')']=1;
// disallowedcomb['(']['+']=1;
disallowedcomb['+']['}']=1;
// disallowedcomb['{']['+']=1;
disallowedcomb['+'][']']=1;
// disallowedcomb['[']['+']=1;
disallowedcomb['-'][')']=1;
// disallowedcomb['(']['-']=1;
disallowedcomb['-']['}']=1;
// disallowedcomb['{']['-']=1;
disallowedcomb['-'][']']=1;
// disallowedcomb['[']['-']=1;
disallowedcomb['*'][')']=1;
// disallowedcomb['(']['*']=1;
disallowedcomb['*']['}']=1;
// disallowedcomb['{']['*']=1;
disallowedcomb['*'][']']=1;
// disallowedcomb['[']['*']=1;
disallowedcomb['/'][')']=1;
// disallowedcomb['(']['/']=1;
disallowedcomb['/']['}']=1;
// disallowedcomb['{']['/']=1;
disallowedcomb['/'][']']=1;
// disallowedcomb['[']['/']=1;
char parant_type_open[MAX_STRING_ELMENT_VALUE];
memset(parant_type_open,0,sizeof(char)*MAX_STRING_ELMENT_VALUE);
char parant_type_close[MAX_STRING_ELMENT_VALUE];
memset(parant_type_close,0,sizeof(char)*MAX_STRING_ELMENT_VALUE);
parant_type_open['(']=1;
parant_type_close[')']=1;
parant_type_open['[']=1;
parant_type_close[']']=1;
parant_type_open['{']=1;
parant_type_close['}']=1;
char parant_matches[MAX_STRING_ELMENT_VALUE];
memset(parant_matches,0,sizeof(char)*MAX_STRING_ELMENT_VALUE);
parant_matches[')']='(';
// parant_matches['(']=')';//may not seem corect but we do not care :P
// parant_matches['{']='}';
parant_matches['}']='{';
// parant_matches['[']=']';
parant_matches[']']='[';
int cur_depth_type[100000]; //ok ez helyett 1 lista kell !
int depth_ind=0;
char Zstring[10000];
strcpy(Zstring,"(1+2)+3+(4-");
for(size_t i=0;i<strlen(Zstring);i++)
{
if(disallowedcomb[Zstring[i]][Zstring[i+1]])
printf("No correct use of operator\n");
if(parant_type_open[Zstring[i]])
cur_depth_type[depth_ind++]=Zstring[i];
if(parant_type_close[Zstring[i]])
{
//check if we have this opened so we can close it
if(depth_ind>0)
{
if(cur_depth_type[depth_ind-1]!=parant_matches[Zstring[i]])
printf("we are trying to close a paranthese that has not been opened yet\n");
else depth_ind--;
}
else printf("trying to close a paranthese but none were opened yet\n");
}
}
if(depth_ind)
printf("not all parantheses weere closed\n");
int temp=strlen(Zstring);
if(temp>0)
{
temp--;
if( Zstring[temp]=='+' ||
Zstring[temp]=='*' ||
Zstring[temp]=='/' ||
Zstring[temp]=='-' )
printf("String terminates in operator, not alowed\n");
}
printf("finished testing string\n");
char c=getch();
}