home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Emulation / AmigaVGB / demos / RPN.c < prev    next >
C/C++ Source or Header  |  1996-06-03  |  1KB  |  103 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. #define MAXOP 40
  5. #define NUMBER '0'
  6. #define STACKSIZE 40
  7.  
  8. int sp;
  9. int stack[STACKSIZE];
  10.  
  11. char s[MAXOP];
  12. int pos;
  13. int n;
  14.  
  15. void push(int i)
  16. {
  17.   if(sp < STACKSIZE)
  18.     stack[sp++] = i;
  19.   else
  20.     puts("Stack full");
  21. }
  22.  
  23. int pop()
  24. {
  25.   if(sp > 0)
  26.     return stack[--sp];
  27.   else
  28.     puts("Stack empty");
  29.   return 0;
  30. }
  31.  
  32. int top()
  33. {
  34.   if(sp > 0)
  35.     return stack[sp-1];
  36.   else
  37.     puts("Stack empty");
  38.   return 0;
  39. }
  40.  
  41. int read_op()
  42. {
  43.   if(pos == -1) {
  44.     gets(s);
  45.     pos = 0;
  46.   }
  47.  
  48.   while(s[pos] == ' ' || s[pos] == '\t')
  49.     pos++;
  50.  
  51.   if(s[pos] == '\0') {
  52.     pos = -1;
  53.     return('\n');
  54.   }
  55.  
  56.   if(!isdigit(s[pos]))
  57.     return(s[pos++]);
  58.  
  59.   n = s[pos] - '0';
  60.   while(isdigit(s[++pos]))
  61.     n = 10 * n + s[pos] - '0';
  62.  
  63.   return NUMBER;
  64. }
  65.  
  66. void main()
  67. {
  68.   int type;
  69.   int op2;
  70.  
  71.   puts("RPN Calculator");
  72.   sp = 0;
  73.   pos = -1;
  74.  
  75.   while((type = read_op(s)) != EOF) {
  76.     switch(type) {
  77.     case NUMBER:
  78.       push(n);
  79.       break;
  80.     case '+':
  81.       push(pop() + pop());
  82.       break;
  83.     case '*':
  84.       push(pop() * pop());
  85.       break;
  86.     case '-':
  87.       op2 = pop();
  88.       push(pop() - op2);
  89.       break;
  90.     case '/':
  91.       op2 = pop();
  92.       if(op2 != 0)
  93.     push(pop() / op2);
  94.       else
  95.     puts("Divide by 0");
  96.       break;
  97.     case '\n':
  98.       printf("==> %d\n", top());
  99.       break;
  100.     }
  101.   }
  102. }
  103.