Infix 2 Postfix & calculate it
//tamrin tahvili....
#include (iostream.h)
#include (stdlib.h)
//===Start of class/stack/=======================
//2 ta class baraye stack darim yeki baraye dade haye "char" va yeki baraye dade haye "int"
#define MAX 30
class stack
{
private:
char s[MAX];
int top;
public:
stack()
{
top=-1;
}
int push(char);
char pop();
void show();
};
int stack::push(char x)
{
if( top >= (MAX-1) )
return 0;
top++;
s[top]=x;
return 1;
}
char stack::pop()
{
if(top==-1)
return '\0';
char y=s[top];
top--;
return y;
}
void stack::show()
{
for(int j=0;j
cout<
}
//classe stack maksoose dade "int"
class int_stack
{
private:
int s[MAX];
int top;
public:
int_stack()
{
for(int i=0;i
s[i]=0;
top=-1;
}
int push(int);
int pop();
};
int int_stack::push(int x)
{
if( top >= (MAX-1) )
return 0;
top++;
//cout<<"push"<<<" top="<<
s[top]=x;
return 1;
}
int int_stack::pop()
{
if(top==-1)
return -1;
int y=s[top];
top--;
//cout<<"pop"<<<" top="<<
return y;
}
//======End of class/stack/===================================
//======Start of class/term/==================================
class term
{
private:
char postfix[MAX*2];
char var[MAX];
int val[MAX];
int front;
int p;
int specify_type(char);
void preference(stack &stk,char chr);
public:
term()
{
postfix[0]='\0';
front=0;
p=0;
}
void set();//daryafte meghdare har moteghayer az karbar
void postfix_add(char);//jomalate postfix ra be araye "postfix[MAX*2]" ezafe mikonad
void postfix_show(char []);//yek ebarat ra be postfix tabdil va an ra namayesh midahad
int front_return();
int postfix_compute();//mohasebe hasele yek ebarate postfix
int add(char);//ezafe kardane yek moteghayere jadid be list,ta badan meghdare an ra az karbar beporsim !!!!
int exp(int,int);//be tavan resandane yek adad
};
void term::set()
{
for(int i=0;i
{
cout<<'\n'<<<" = ";
cin>>val[i];
}
}
int term::front_return()
{
return front;
}
int term::add(char c)
{
for(int i=0;i
{
if(var[i]==c)//agar moteghayer vojod dasht digar ezafe nemishavad
return -1;
}
var[front]=c;//moteghayere jadid ra be list ezafe mikonim
front++;
return front;
}
void term::postfix_add(char c)
{
postfix[p]=c;
p++;
postfix[p]='\0';
}
void term::postfix_show(char t[])
{
char z;
stack q1;
for(int i=0 ; t[i] != '\0' ; i++)
{
z=t[i];
switch ( specify_type(z) )
{
case 2:
postfix_add(z);
add(z);
break;
case 1:
postfix_add(z);
break;
case 0:
preference(q1,z);
q1.push(z);
break;
default:
break;
}
}
//amalgar haye baghi mande dar stack ra be ebarat ezafe mikonim
int a=1;
do
{
z=q1.pop();
if(z == '\0')
a=0;
else
postfix_add(z);
}
while(a==1);
cout<
}
int term::postfix_compute()//in ghesmat kheili sadeh ast !!!!
{
int_stack q1;
char chr;
int a,b;
for(int i=0 ;postfix[i] != '\0' ;i++)
{
chr=postfix[i];
switch (specify_type(chr))
{
case 2:
for(int j=0 ; var[j] != '\0';j++)
{
if(var[j]==chr)
{
q1.push(val[j]);
continue;
}
}
break;
case 1:
q1.push(chr-'0');
break;
case 0:
if(chr=='*')
{
a=q1.pop();
b=q1.pop();
q1.push(a*b);
}
else if(chr=='/')
{
a=q1.pop();
b=q1.pop();
q1.push(b/a);
}
else if(chr=='+')
{
a=q1.pop();
b=q1.pop();
q1.push(a+b);
}
else if(chr=='-')
{
a=q1.pop();
b=q1.pop();
q1.push(b-a);
}
else if(chr=='^')
{
a=q1.pop();
b=q1.pop();
q1.push(exp(b,a));
}
break;
default:
break;
}
}
int res=q1.pop();//pasokh haman meghdari ast ke dar stack baghi mande
return res;
}
int term::exp(int p,int e)
{
int s=1;
for(int i=0;i
s=s*p;
return s;
}
int term::specify_type(char chr)
{
if((chr >= 'a' && chr <= 'z') || (chr >='A' && chr <= 'Z'))
return 2;
else if(chr >= '0' && chr <= '9')
return 1;
else if(chr=='*' || chr=='/' || chr=='+' || chr=='-' || chr=='^')
return 0;
else
return -1;
}
void term::preference(stack &stk,char chr)
{
int a=1;
char z;
switch (chr)
{
case '+':
case '-':
do
{
z=stk.pop();
if(z=='\0')
a=0;
else
postfix_add(z);
}
while(a==1);
break;
case '*':
case '/':
do
{
z=stk.pop();
if(z=='\0')
a=0;
else if( z=='*' || z=='/' || z=='^')
postfix_add(z);
else if(z=='+' || z=='-')
{
stk.push(z);
a=0;
}
}
while(a==1);
break;
case '^':
break;
default:
break;
}
}
//======End of class/term/====================================
void main()
{
char t1[MAX];
term term1;
char r='y';
cout<<"Enter your term"<
cin>>t1;
term1.postfix_show(t1);//convert Infix term to Postfix term
cout<<"\nYou have ("<<<") variable,Tell me value of each:";
term1.set();//get value of each variable
cout<<"Result of your term is = "<
cout<<"\nFinish !\nEnter any things to exit>";
cin>>r;
}
