Evaluates arithmetic expressions composed of 1-digit numbers - C++ Data Structure

C++ examples for Data Structure:Stack

Description

Evaluates arithmetic expressions composed of 1-digit numbers

Demo Code

#include <iostream>
#include <cstring>                 
using namespace std;
const int LEN = 80;    //length of expressions, in characters
const int MAX = 40;    //size of stack
class Stack/*w  ww  . j ava  2  s.  co  m*/
{
   private:
   char st[MAX];                  //stack: array of chars
   int top;                       //number of top of stack
   public:
   Stack()
   { top = 0; }
   void push(char var)            //put char on stack
   { st[++top] = var; }
   char pop()                     //take char off stack
   { return st[top--]; }
   int gettop()                   //get top of stack
   { return top; }
};
class express                        //expression class
{
   private:
   Stack s;                       //stack for analysis
   char* pStr;                    //pointer to input string
   int len;                       //length of input string
   public:
   express(char* ptr)
   {
      pStr = ptr;                 //set pointer to string
      len = strlen(pStr);         //set length
   }
   void parse();                  //parse the input string
   int solve();                   //evaluate the stack
};
void express::parse()                //add items to stack
{
   char ch;
   char lastval;                     //last value
   char lastop;                      //last operator
   for(int j=0; j<len; j++)
   {
      ch = pStr[j];                  //get next character
      if(ch>='0' && ch<='9')         //if it's a digit, save numerical value
         s.push(ch-'0');
      else if(ch=='+' || ch=='-' || ch=='*' || ch=='/')
      {
         if(s.gettop()==1)           //if it's first operator
            s.push(ch);              //put on stack
         else                        //not first operator
         {
            lastval = s.pop();       //get previous digit
            lastop = s.pop();        //get previous operator
            //if this is * or / AND last operator was + or -
            if( (ch=='*' || ch=='/') && (lastop=='+' || lastop=='-') )
            {
               s.push(lastop);       //restore last two pops
               s.push(lastval);
            }
            else
            {
               switch(lastop)        //do last operation
               {                  //push result on stack
                   case '+': s.push(s.pop() + lastval); break;
                   case '-': s.push(s.pop() - lastval); break;
                   case '*': s.push(s.pop() * lastval); break;
                   case '/': s.push(s.pop() / lastval); break;
                   default:  cout << "\nUnknown oper"; exit(1);
               }
            }  //end else, in all other cases
            s.push(ch);              //put current op on stack
         }  //end else, not first operator
      }
      else
      { 
         cout << "\nUnknown input character"; exit(1); 
      }
   }
}
int express::solve()                 //remove items from stack
{
   char lastval;                     //previous value
   while(s.gettop() > 1)
   {
      lastval = s.pop();             //get previous value
      switch( s.pop() )              //get previous operator
      {                           //do operation, push answer
          case '+': s.push(s.pop() + lastval); break;
          case '-': s.push(s.pop() - lastval); break;
          case '*': s.push(s.pop() * lastval); break;
          case '/': s.push(s.pop() / lastval); break;
          default:  cout << "\nUnknown operator"; exit(1);
       }
    }
    return int( s.pop() );            //last item on stack is ans
}
int main()
{
    char ans;                         //'y' or 'n'
    char string[LEN];                 //input string from user
    cout << "\nEnter an arithmetic expression"
        "\nof the form 2+3*4/3-2."
        "\nNo number may have more than one digit."
        "\nDon't use any spaces or parentheses.";
    do {
       cout << "\nEnter expresssion: ";
       cin >> string;                        //input from user
       express* eptr = new express(string);  //make expression
       eptr->parse();                        //parse it
       cout << "\nThe numerical value is: "
       << eptr->solve();                //solve it
       delete eptr;                          //delete expression
       cout << "\nDo another (Enter y or n)? ";
       cin >> ans;
    } while(ans == 'y');
    return 0;
}

Result


Related Tutorials