Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // rpn.c
- //
- //
- // Created by Douglas Frisk on 2008-09-13.
- // Copyright 2008 __MyCompanyName__. All rights reserved.
- //
- /* RPN calculator. */
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdarg.h>
- #include <ctype.h>
- #ifndef SIZE
- #define SIZE 10
- #endif
- #ifndef NBR
- #define NBR_SIZE 10
- #endif
- struct the_stack
- {
- int top;
- int data[SIZE];
- };
- static char* progname; // program name set in main from argv.
- static struct the_stack stack = { 1 };
- int nbr = 0;
- void error(char* msg, ...)
- {
- va_list ap;
- va_start(ap, msg);
- fprintf(stderr, "%s: error: ", progname);
- vfprintf(stderr, msg, ap);
- va_end(ap);
- exit(1);
- }
- void calculate(char op)
- {
- int nbr1, nbr2;
- nbr1 = pop();
- nbr2 = pop();
- int result;
- switch(op)
- {
- case '+' :
- push(nbr1 + nbr2);
- break;
- case '-' :
- push(nbr2 - nbr1);
- break;
- case '*' :
- push(nbr1 * nbr2);
- break;
- case '/' :
- if(nbr1 == 0)
- {
- error("Divide by zero");
- }
- push(nbr2 / nbr1);
- break;
- default :
- printf("%c is not a legal operand.\n", op);
- }
- }
- void push(int n)
- {
- if(stack.top == SIZE)
- {
- printf("Your stack is full. No room to push.\n");
- }
- stack.data[(stack.top)++] = n;
- }
- int pop()
- {
- if(stack.top==0)
- {
- printf("Empty stack, nothing to pop.\n");
- }
- return stack.data[--(stack.top)];
- }
- int nbr_parse(char c)
- {
- char nbr[NBR_SIZE], *endptr;
- int cnt = 0;
- while(c != EOF && !isspace(c))
- {
- nbr[cnt++] = c;
- c = getchar();
- }
- nbr[cnt] = '\0';
- int return_value = strtol(nbr, &endptr, 10);
- if(*endptr!='\0')
- {
- error("Syntax error\n");
- }
- return return_value;
- }
- int main(int argc, char** argv)
- {
- progname = argv[0];
- printf("Enter expression:\n");
- char c;
- int prev = 0;
- while((c=getchar()) != EOF)
- {
- switch(c)
- {
- case '+' :
- case '-' :
- case '*' :
- case '/' :
- calculate(c);
- break;
- case '\n' :
- printf("Result: %d\n", pop());
- break;
- default :
- if(!isspace(c))
- {
- push(nbr_parse(c));
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment