// ========================================================================== // Reverse Polish Notation Calculator // ========================================================================== // RPN Calculator in C // // Inf2C-CS Coursework 1. Task B // SOLUTION // Paul Jackson // 10 Oct 2012 //--------------------------------------------------------------------------- // C definitions for SPIM system calls //--------------------------------------------------------------------------- #include int read_char() { return getchar(); } int read_int() { int i; scanf("%i", &i); return i; } void read_string(char* s, int size) { fgets(s, size, stdin); } void print_char(int c) { putchar(c); } void print_int(int i) { printf("%i", i); } void print_string(char* s) { printf("%s", s); } //--------------------------------------------------------------------------- // Global variables //--------------------------------------------------------------------------- #define STACK_SIZE 5 int stack[STACK_SIZE]; // Stack always has 0 .. STACK_SIZE - 1 entries. int input_char; // Input character int *sp = &stack[0]; // Pointer to 1st empty location on stack. //--------------------------------------------------------------------------- // PUSH function //--------------------------------------------------------------------------- // Push onto stack. No-op if stack full. void push(int i) { if (sp < stack + STACK_SIZE) { *sp = i; sp++; } return; } //--------------------------------------------------------------------------- // POP function //--------------------------------------------------------------------------- // Pop from stack. Returns 0 if stack empty. int pop() { if (stack < sp) { sp--; return *sp; } else return 0; } //--------------------------------------------------------------------------- // MAIN function //--------------------------------------------------------------------------- int main (void) { print_string("> "); while (1) { input_char = read_char(); if (input_char == EOF) { // Case not needed for student solution print_string("\nERROR\n"); return 1; } else if (input_char == '\n') break; else if ('0' <= input_char && input_char <= '9') { int cval = input_char - '0'; push(pop() * 10 + cval); } else if (input_char == 'e') { // Enter new number push(0); } else if (input_char == 'n') { // Negate push(-pop()); } else if (input_char == '+') { // C standard doesn't say which pop() is evaluated first. // Doesn't matter here, since + is commutative. push(pop() + pop()); } else if (input_char == '-') { int arg2 = pop(); int arg1 = pop(); push(arg1 - arg2); } else if (input_char == '*') { push(pop() * pop()) ; } } // END while (1) // Print stack print_string("\n"); // Extra code if one wants to print a stack empty message. // This code was not required in submitted solutions. // if (sp == stack) { // print_string("EMPTY\n"); // } else { int *pp = &stack[0]; // pp = print pointer while (pp != sp) { print_int(pp - stack); print_string(": "); print_int(*pp); print_string("\n"); pp++; } // } return 0; } //--------------------------------------------------------------------------- // End of file //---------------------------------------------------------------------------