Guest User

Untitled

a guest
May 21st, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  1. //
  2. // rpn.c
  3. //
  4. //
  5. // Created by Douglas Frisk on 2008-09-13.
  6. // Copyright 2008 __MyCompanyName__. All rights reserved.
  7. //
  8. /* RPN calculator. */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <stdarg.h>
  13. #include <ctype.h>
  14.  
  15. #ifndef SIZE
  16. #define SIZE 10
  17. #endif
  18.  
  19. #ifndef NBR
  20. #define NBR_SIZE 10
  21. #endif
  22.  
  23. struct the_stack
  24. {
  25. int top;
  26. int data[SIZE];
  27. };
  28.  
  29. static char* progname; // program name set in main from argv.
  30. static struct the_stack stack = { 1 };
  31.  
  32. int nbr = 0;
  33.  
  34.  
  35.  
  36. void error(char* msg, ...)
  37. {
  38. va_list ap;
  39.  
  40. va_start(ap, msg);
  41. fprintf(stderr, "%s: error: ", progname);
  42. vfprintf(stderr, msg, ap);
  43. va_end(ap);
  44. exit(1);
  45. }
  46.  
  47. void calculate(char op)
  48. {
  49. int nbr1, nbr2;
  50. nbr1 = pop();
  51. nbr2 = pop();
  52. int result;
  53. switch(op)
  54. {
  55. case '+' :
  56. push(nbr1 + nbr2);
  57. break;
  58. case '-' :
  59. push(nbr2 - nbr1);
  60. break;
  61. case '*' :
  62. push(nbr1 * nbr2);
  63. break;
  64. case '/' :
  65. if(nbr1 == 0)
  66. {
  67. error("Divide by zero");
  68. }
  69. push(nbr2 / nbr1);
  70. break;
  71. default :
  72. printf("%c is not a legal operand.\n", op);
  73. }
  74. }
  75.  
  76. void push(int n)
  77. {
  78. if(stack.top == SIZE)
  79. {
  80. printf("Your stack is full. No room to push.\n");
  81. }
  82. stack.data[(stack.top)++] = n;
  83. }
  84.  
  85. int pop()
  86. {
  87. if(stack.top==0)
  88. {
  89. printf("Empty stack, nothing to pop.\n");
  90. }
  91. return stack.data[--(stack.top)];
  92. }
  93.  
  94. int nbr_parse(char c)
  95. {
  96. char nbr[NBR_SIZE], *endptr;
  97. int cnt = 0;
  98. while(c != EOF && !isspace(c))
  99. {
  100. nbr[cnt++] = c;
  101. c = getchar();
  102. }
  103. nbr[cnt] = '\0';
  104.  
  105. int return_value = strtol(nbr, &endptr, 10);
  106.  
  107. if(*endptr!='\0')
  108. {
  109. error("Syntax error\n");
  110. }
  111. return return_value;
  112. }
  113.  
  114. int main(int argc, char** argv)
  115. {
  116. progname = argv[0];
  117. printf("Enter expression:\n");
  118. char c;
  119. int prev = 0;
  120. while((c=getchar()) != EOF)
  121. {
  122. switch(c)
  123. {
  124. case '+' :
  125. case '-' :
  126. case '*' :
  127. case '/' :
  128. calculate(c);
  129. break;
  130. case '\n' :
  131. printf("Result: %d\n", pop());
  132. break;
  133. default :
  134. if(!isspace(c))
  135. {
  136. push(nbr_parse(c));
  137. }
  138. }
  139. }
  140. }
Add Comment
Please, Sign In to add comment