fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct stack {
  5. int v;
  6. struct stack *next;
  7. };
  8.  
  9. void init(struct stack **h)
  10. {
  11. *h = malloc(sizeof(struct stack));
  12. (*h)->next = NULL;
  13. }
  14.  
  15. void push(struct stack *h, int v)
  16. {
  17. struct stack *t;
  18.  
  19. t = malloc(sizeof(struct stack));
  20. t->v = v;
  21. t->next = h->next;
  22. h->next = t;
  23. }
  24.  
  25. int pop(struct stack *h)
  26. {
  27. int v;
  28. struct stack *t;
  29.  
  30. t = h->next;
  31. h->next = t->next;
  32. v = t->v;
  33. free(t);
  34.  
  35. return v;
  36. }
  37.  
  38. int stack_empty(struct stack *h)
  39. {
  40. return h->next == NULL;
  41. }
  42.  
  43. int main(void)
  44. {
  45. int op, n, c, op1, op2;
  46. struct stack *number, *operator;
  47. char s[200];
  48.  
  49. init(&number);
  50. init(&operator);
  51. while((c = getchar()) != '\n'){
  52. if(c <= '9' && c >= '0')
  53. {
  54. n = c-'0';
  55. while((c = getchar()) && c <= '9' && c >= '0')
  56. {
  57. n = n*10+c-'0';
  58. }
  59. push(number, n);
  60. }
  61. if(c == '\n' || c == EOF) break;
  62. if(c == '+' || c == '-' || c == '*')
  63. {
  64. push(operator, (int) c);
  65. } else if(c == ')')
  66. {
  67. op = pop(operator);
  68. if(op == '+'){
  69. n = pop(number)+pop(number);
  70. push(number, n);
  71. } else if(op == '-'){
  72. op1 = pop(number);
  73. op2 = pop(number);
  74. n = op2-op1;
  75. push(number, n);
  76. } else if(op == '*'){
  77. n = pop(number)*pop(number);
  78. push(number, n);
  79. }
  80. }
  81. }
  82. printf("Evaluation: %d\n", pop(number));
  83. free(number);
  84. free(operator);
  85.  
  86. return 0;
  87. }
  88.  
Success #stdin #stdout 0s 2188KB
stdin
(5*(((9+8)*(4*6))+7))
stdout
Evaluation: 2075