Hi GuyZ,
This is another question which you may want to solve in you graduation level/post-graduation level `Data structures and Algorithms`. The solution is given bellow.
This is another question which you may want to solve in you graduation level/post-graduation level `Data structures and Algorithms`. The solution is given bellow.
Source Code
/*
[][][]
[][][]
[][][]
[][][] TerminalCoders.Blogspot.Com
[][][]
[][][]
[][][]
*/
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
struct symtable
{
char var;
int val;
};
class stack
{
int arr[1024];
int ptr, i;
public:
stack()
{
ptr = 0;
}
int isEmpty()
{
if(ptr==0)return 1;
return 0;
}
int top()
{
return arr[ptr-1];
}
void push(int c)
{
arr[ptr++] = c;
}
int pop()
{
return arr[--ptr];
}
void disp()
{
for(i=0;i<ptr;i++)cout<<arr[i]<<" ";
cout<<endl;
}
};
class prefix
{
int i, symLen, op1, op2;
long int res;
char pre[1024];
symtable sym[1024];
stack stk;
public:
prefix()
{
symLen = 0;
}
void reverse(char *str, int l)
{
for(i=0;i<l/2;i++)
{
char tmp = str[i];
str[i] = str[l-i-1];
str[l-i-1] = tmp;
}
}
int isInSymtab(char ch, int len)
{
for(i=0;i<len;i++)
{
if(sym[i].var==ch)return 1;
}
return 0;
}
int getVal(char ch, int len)
{
for(i=0;i<len;i++)
{
if(sym[i].var==ch)return sym[i].val;
}
}
int isOperator(char ch)
{
if(ch=='+' || ch=='-' || ch=='/' || ch=='*' || ch=='^')return 1;
return 0;
}
void read()
{
cout<<"Enter expression: ";
cin.getline(pre, 1024);
reverse(pre, strlen(pre));
}
void eval()
{
int sum, p;
char str[2], *ptr = pre;
while(*ptr!='\0')
{
if(isupper(*ptr))
{
if(isInSymtab(*ptr, symLen))
{
stk.push(getVal(*ptr, symLen));
}
else
{
cout<<"Enter value for "<<*ptr<<": ";
cin>>i;
stk.push(i);
//cout<<stk.top()<<endl;
sym[symLen].var = *ptr;
sym[symLen].val=i;
symLen++;
}
}
else if(isdigit(*ptr))
{
sprintf(str, "%c", *ptr);
sum = atoi(str);
p = 10;
*ptr++;
while(isdigit(*ptr))
{
sprintf(str, "%c", *ptr);
sum+=(atoi(str)*p);
p*=10;
*ptr++;
}
*ptr--;
stk.push(sum);
}
else if(isOperator(*ptr))
{
op1 = stk.pop();
op2 = stk.pop();
switch(*ptr)
{
case '+':
res = op1+op2;
break;
case '-':
res = op1-op2;
break;
case '/':
res = op1/op2;
break;
case '*':
res = op1*op2;
break;
case '^':
res = pow(op1, op2);
break;
}
stk.push(res);
}
*ptr++;
}
int ans = stk.pop();
cout<<"Result: "<<ans<<endl;
}
};
int main()
{
prefix pre;
pre.read();
pre.eval();
return 0;
}
