Thread: reverse polish calculator

  1. #1
    Registered User
    Join Date
    Jul 2009
    Location
    Croatia
    Posts
    272

    reverse polish calculator

    so im testing this code for a reverse polish calculator:

    and i dont know which input to enter to get a computation? I tried every possiblity like 1+2 and then enter, 12+ enter, and i cant get a result, it always says the stack is empty.

    Code:
    #include <stdio.h>
    #include <stdlib.h> /* for atof() - in K&R, math.h is referenced - this is an anachronism */
    
    #define MAXOP 100 /* max size of operand or operator */
    #define NUMBER '0' /* signal that a number was found */
    
    int getop(char []);
    void push(double);
    double pop(void);
    
    /* reverse Polish calculator */
    
    int main(void)
    {
      int type;
      double op2;
      char s[MAXOP];
    
      while((type = getop(s)) != EOF)
      {
        switch(type)
        {
          case NUMBER:
            push(atof(s));
            break;
          case '+':
            push(pop() + pop());
            break;
          case '*':
            push(pop() * pop());
            break;
          case '-':
            op2 = pop();
            push(pop() - op2);
            break;
          case '/':
            op2 = pop();
            if(op2 != 0.0)
              push(pop() / op2);
            else
              printf("error: zero divisor\n");
            break;
          case '\n':
            printf("\t%.8g\n", pop());
            break;
          default:
            printf("error: unknown command %s\n", s);
            break;
        }
      }
    
      return 0;
    }
    
    #define MAXVAL  100 /* maximum depth of val stack */
    
    int sp = 0; /* next free stack position */
    double val[MAXVAL]; /* value stack */
    
    /* push: push f onto value stack */
    void push(double f)
    {
      if(sp < MAXVAL)
        val[sp++] = f;
      else
        printf("error: stack full, can't push %g\n", f);
    }
    
    /* pop: pop and return top value from stack */
    double pop(void)
    {
      if(sp > 0)
        return val[--sp];
      else
      {
        printf("error: stack empty\n");
        return 0.0;
      }
    }
    
    #include <ctype.h>
    
    int getch(void);
    void ungetch(int);
    
    /* getop: get next operator or numeric operand */
    int getop(char s[])
    {
      int i, c;
    
      while((s[0] = c = getch()) == ' ' || c == '\t')
        ;
    
      s[1] = '\0';
      if(!isdigit(c) && c != '.')
        return c; /* not a number */
      i = 0;
      if(isdigit(c)) /* collect integer part */
        while(isdigit(s[++i] = c = getch()))
          ;
      if(c == '.')
        while(isdigit(s[++i] = c = getch()))
          ;
      s[i] = '\0';
      if(c != EOF)
        ungetch(c);
      return NUMBER;
    }
    
    #define BUFSIZE 100
    
    char buf[BUFSIZE]; /* buffer for ungetch */
    int bufp = 0; /* next free position in buf */
    
    int getch(void) /* get a (possibly pushed back) character */
    {
      return (bufp > 0) ? buf[--bufp] : getchar();
    }
    
    void ungetch(int c) /* push character back on input */
    {
      if(bufp >= BUFSIZE)
        printf("ungetch: too many characters\n");
      else
        buf[bufp++] = c;
    }

  2. #2
    Registered User
    Join Date
    Jul 2009
    Location
    Croatia
    Posts
    272
    Never mind i found out how.

    What i dont understand about the function ungetch():

    Code:
    void ungetch(int c) /* push character back on input */
    {
      if(bufp >= BUFSIZE)
        printf("ungetch: too many characters\n");
      else
        buf[bufp++] = c;
    }
    Why is it using a buffer? We're pushing one character back, itll never happen that buffer gets filled with more then 1 character anyway, because the way getop works... the book says

    "The standard library includes a function ungetc that provides one char of pushback. We have used an array for the pushback rater then a single char to illustrate a more general approach."

    So im sort of confused...

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Reverse Polish Notation Calculator
    By jazzyqueen in forum C Programming
    Replies: 1
    Last Post: 09-02-2009, 03:55 AM
  2. Postfix (reverse polish notation) calculator
    By ottomated in forum C Programming
    Replies: 7
    Last Post: 05-06-2008, 05:32 PM
  3. gethostbyaddr() reverse lookups failing (???)
    By Uncle Rico in forum C Programming
    Replies: 9
    Last Post: 08-19-2005, 09:22 AM
  4. Reverse Polish Calculator
    By BlasterStar in forum C++ Programming
    Replies: 3
    Last Post: 01-22-2003, 11:12 PM
  5. c++ Reverse Polish Calculator Help
    By knight101 in forum C++ Programming
    Replies: 5
    Last Post: 11-12-2001, 09:31 AM