postfix expression evaluation,,urgent help plsssssssssss

Discussion in 'C++' started by sarah24, Oct 3, 2007.

  1. sarah24

    sarah24 New Member

    Joined:
    Sep 25, 2007
    Messages:
    4
    Likes Received:
    0
    Trophy Points:
    0
    Hi All Experts!

    i need some help ,i have written a code but my output is not correct can somebody look into it ...
    here's the problem statement..



    /*REVISED PROGRAMMING ASSIGNMENT #2
    program 2: call it 575_prog2.cpp
    due on thursday september 27, 2007 by class time
    evaluate a postfix expression containing some one-letter variables a-z (lower case) whose values are given in a data file called: c:\\temp\\575_prog2_data.txt
    make sure to include this complete path for the data file.
    there will not be more than 26 different variables (a-z) and there will not be more than 20 postfixes the operators will be: + - * / and ^
    all computations are integer computations e.g., 7/2=3
    use a stack of integers and the algorithm below to compute the value of the given postfix expressions.
    scan a postfix expression left to right char by char:
    if char is operand (i.e., variable ) find its value and push the value on the stack
    if the value of the variable is not given, report "invalid postfix" and go to the next problem
    if char is operator + - * / ^ get the top of the stack (say A) and pop the stack.
    again get the top of the stack (say B) and pop the stack. compute "B operator A" and push the result on stack
    if there is any stack problem AT ANY TIME "report invalid postfix" and go to the next problem
    if there is 0 divide problem report "zero divide" and go to the next problem
    if char is neither variable nor operator report "invalid postfix" and go to the next problem
    at the end of scanning the postfix, if stack contains exactly one integer return this value as the answer
    if stack is empty or has more than one integer report invalid postfix and go to the next problem
    end of algorithm

    input data format:
    the first line gives how many variables there are (n)
    the next n lines are the variables and their values separated by a space.
    the rest of the lines are the POSTFIX expressions that you need to evaluate.
    ================
    5 //this is only a sample; your data may be different
    a 4
    d 9
    z 17
    y 0
    x 2
    aD+
    ad+zy-x/*
    xz*yd+ad-*+
    ab+
    ad*yz*+ad*yz*-*
    adz*+yx/-
    zy/
    adx^+

    your output should look like:
    =============================
    a 4
    d 9
    z 17
    y 0
    x 2
    aD+ invalid postfix ERROR
    ad+zy-x/* = 104
    xz*yd+ad-*+ = -11
    ab+ invalid postfix ERROR
    ad*yz*+ad*yz*-* = 1296
    adz*+yx/- = 157
    zy/ zero divide ERROR
    adx^+ = 85
    program 575_prog2.cpp written by <your name here> ===================================


    and this is my code....
    Code:
    #include <iostream>
    #include <iomanip>
    #include <stack>
    #include <fstream>
    #include <string>
    using namespace std;
    using std::string;
    using std::cout;
    using std::cerr;
    #define MAX 20
    
    //global variables
    string vars=""; //add the variables to this string as you read them
    int vals[26]; //add the values of the variables to this array as you read them
    int valA;
    int valB;
    string pf[MAX];
    int num_vars; //number of variables
    int num_pfs;
    int ndx;
    stack<int>s;
    int found;
    int ops;
    int lenops;
    char token;
    int i;
    void process_pf(string pf);
    
    int var2ndx(string var) {  //given a variable it returns its index in vars
                               //so that its value may be found as vals[index]
      ndx=vars.find(var);
      if ( (ndx>=0) && (ndx<vars.length()) ) return ndx;
      cout << "illegal variable " << var << "\n";
      return -1; //this signals that the variable is invalid
    }
    
    
    void read_vars_vals(){
      string var; int val;
      ifstream inf;
      inf.open("c:\\temp\\575_prog2_data.txt");
      if (!inf) { cout << "input data should be in c:\\temp\\575_prog2_data.txt\n"; exit(0); }
      //read the number of variables (global)
      inf >> num_vars;
      //loop and read this many vars and vals
      for (int i=0; i<num_vars; i++) {
        inf >> var >> val;
    	vars=vars+var;
    	vals[i]=val;
        cout<<vars[i]<<" "<<vals[i]<<endl; 
      }
      //then read all the strings of postfx expressions into an array of strings
      int i=0;
      while (inf >> pf[i]) i++;  //pf is the array of postfix strings (global variable)
      num_pfs=i;
      inf.close();
    }
    
    bool is_operand(string ch) {
      found=vars.find(ch); int lenvars=vars.length();
      if ( (found>=0) && (found<lenvars) ) return true;
      else return false;
    }
    bool is_operator(string ch) {
      string ops="+-^*/"; found=ops.find(ch); lenops=ops.length();
      if ( (found>=0) && (found<lenops) ) return true;
      else return false;
    }
    
    void process_operand(string opnd,int i) {
    	
    	if (is_operand(opnd))
    	
    	s.push(vals[i]);
    	
    	else
    	 cout<<"invalid postfix error" <<endl;
    	// process_pf(opnd);   		
    	}
    
    void process_operator(string op) {
         if (is_operator(op))
    	 {
    		 valA = s.top();
             s.pop();
             valB = s.top();
             s.pop();
    	 }
    }
    
    void process_pf(string pf) { //pf=a single postfix
                    
    	             // i=0;   
                      token = pf[i];
                      
    				  //while((i < pf.size()) && (token != '='))
                       //{
                               switch(token)
                                {
                                    case '+': vals[i] = valA + valB;
                                              break;
                                    case '-': vals[i] = valB - valA;
                                              break;
                                    case '*': vals[i] = valA*valB;
                                              break;
    
    								case '^':vals[i] = valA^valB;
    
                                    case '/': 
    									try
    									{
    									vals[i] = valA/valB;
    									}
    									catch(...)
    									{
    										cerr<<"divide by zero error";
    									}
    									break;
                                }
                              s.push(vals[i]);
                            
    				//i++;
                    //token = pf[i];
    
              cout << pf << " " << vals[i] << endl;    
                         
                    cout << endl;    
          
    }
    
    
    
     void main() {  
    
      read_vars_vals();  
      
      for (i=0; i<num_pfs; i++) {
    	  	  process_operand(pf[i],i);
    		  process_operator(pf[i]);
              process_pf(pf[i]);
                }
      //footer info like your name etci]
    }
     
    Last edited by a moderator: Oct 3, 2007
  2. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,376
    Likes Received:
    388
    Trophy Points:
    83
    By this time you should know how to have the code blocks in the posts and if you don't know read through the thread Before you make a query (Link at top right corner)
     
  3. sarah24

    sarah24 New Member

    Joined:
    Sep 25, 2007
    Messages:
    4
    Likes Received:
    0
    Trophy Points:
    0
    ok i will keep this in mind,,,but pls help me if u can..
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice