fueanta

Evaluation of a Postfix Expression.

Oct 20th, 2016
163
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define MAX 10
  2. #include "iostream"
  3. #include "cmath"
  4.  
  5. using namespace std;
  6.  
  7. class myStack {
  8.     int top;
  9.     int store[MAX];
  10. public:
  11.     void stack_initialize();
  12.     void push(int);
  13.     void pop();
  14.     int get_top();
  15.     void show();
  16. };
  17.  
  18. void myStack::stack_initialize() {
  19.     top = -1;
  20. }
  21. void myStack::push(int X) {
  22.     if (top >= MAX - 1) {
  23.         cout << "\nOverFlow Error : Your stack is full.\n";
  24.     } else {
  25.         top++;
  26.         store[top] = X;
  27.         cout << "\nPush done..!" << endl;
  28.     }
  29. }
  30. void myStack::pop() {
  31.     if (top < 0) {
  32.         cout << "\nUnderFlow Error : Your stack is empty.\n";
  33.     } else {
  34.         top--;
  35.         cout << "\nPop done..!" << endl;
  36.     }
  37. }
  38. int myStack::get_top() {
  39.     return store[top];
  40. }
  41. void myStack::show() {
  42.     for (int i = top; i >= 0; i--) {
  43.         cout << "|" << store[i] << "|" << endl;
  44.     }
  45. }
  46.  
  47. int main() {
  48.     string postfix; myStack ss;
  49.     cout << "Give your Arithmetic Expression in Postfix notation (Put space between different operands and operators)." << endl;
  50.     cout << "\nLike : 2 3 * -21 - 3 / 5 33 * +   , which evaluates 174." << endl;
  51.     cout << "\nPostfix Expression : "; getline(cin, postfix); ss.stack_initialize();
  52.     for (int i = 0; postfix[i] != '\0'; i++) {
  53.         if (int(postfix[i]) >= 48 && int(postfix[i]) <= 57) {
  54.             int num = int(postfix[i]) - 48;
  55.             if (postfix[i + 1] == ' ') {
  56.                 ss.push(num);
  57.             } else {
  58.                 i++;
  59.                 while (int(postfix[i]) >= 48 && int(postfix[i]) <= 57) {
  60.                     num *= 10;
  61.                     num += (int(postfix[i]) - 48);
  62.                     i++;
  63.                 }
  64.                 i--;
  65.                 ss.push(num);
  66.             }
  67.         }
  68.         else if (postfix[i] == ' ') continue;
  69.         else if (postfix[i] == '-') {
  70.             if (postfix[i + 1] == ' ' || postfix[i + 1] == '\0') {
  71.                 int y = ss.get_top(); ss.pop();
  72.                 int x = ss.get_top(); ss.pop();
  73.                 ss.push(x - y);
  74.             } else {
  75.                 i++;
  76.                 int num = int(postfix[i++]) - 48;
  77.                 while (int(postfix[i]) >= 48 && int(postfix[i]) <= 57) {
  78.                     num *= 10;
  79.                     num += (int(postfix[i]) - 48);
  80.                     i++;
  81.                 }
  82.                 i--;
  83.                 ss.push( -1 * num);
  84.             }
  85.         }
  86.         else {
  87.             int y = ss.get_top(); ss.pop();
  88.             int x = ss.get_top(); ss.pop();
  89.             if (postfix[i] == '+' ) {
  90.                 ss.push(x + y);
  91.             }
  92.             else if (postfix[i] == '*') {
  93.                 ss.push(x * y);
  94.             }
  95.             else if (postfix[i] == '/') {
  96.                 ss.push(x / y);
  97.             }
  98.             else if (postfix[i] == '^') {
  99.                 ss.push(pow(x, y));
  100.             }
  101.             else if (postfix[i] == '%') {
  102.                 ss.push(x % y);
  103.             }
  104.         }
  105.     }
  106.     cout << "\n\nEvaluation done, Ans: " << ss.get_top() << "." << endl;
  107.     return 0;
  108. }
RAW Paste Data