fork download
  1.  
  2. #include <stdio.h>
  3.  
  4.  
  5. #define SIZE 10
  6.  
  7. double stack[SIZE];
  8. int sp;
  9.  
  10. void push(double value);
  11. double pop(void);
  12. int isFull(void);
  13. int isEmpty(void);
  14. void answer(void);
  15. void reset(void);
  16.  
  17. int main(void) {
  18. int choice;
  19. double data, a, b;
  20.  
  21. reset();
  22.  
  23. /* (1) main関数内の処理 loop & switch文 */
  24. while (1) {
  25. printf("1:+, 2:-, 3:*, 4:/, 5:Push, 9:Answer -> ");
  26. if (scanf("%d", &choice) != 1) break;
  27.  
  28. if (choice == 9) {
  29. break;
  30. }
  31.  
  32. switch (choice) {
  33. case 1: /* 足し算 (+) */
  34. b = pop();
  35. a = pop();
  36. push(a + b);
  37. break;
  38. case 2: /* 引き算 (-) */
  39. b = pop();
  40. a = pop();
  41. push(a - b);
  42. break;
  43. case 3: /* 掛け算 (*) */
  44. b = pop();
  45. a = pop();
  46. push(a * b);
  47. break;
  48. case 4: /* 割り算 (/) */
  49. b = pop();
  50. a = pop();
  51. if (b != 0) {
  52. push(a / b);
  53. } else {
  54. printf("Error: Zero division\n");
  55. }
  56. break;
  57. case 5: /* データ入力 (Push) */
  58. printf("Data: ");
  59. scanf("%lf", &data);
  60. push(data);
  61. break;
  62. default:
  63. printf("Invalid choice\n");
  64. break;
  65. }
  66. }
  67.  
  68. answer();
  69. return 0;
  70. }
  71.  
  72. /* (2) reset関数:スタックのポインタを初期化 */
  73. void reset(void) {
  74. sp = 0;
  75. }
  76.  
  77. /* (3) answer関数:計算結果(スタックの一番上の値)を表示 */
  78. void answer(void) {
  79. if (!isEmpty()) {
  80. printf("answer = %f\n", stack[sp - 1]);
  81. } else {
  82. printf("Stack is empty\n");
  83. }
  84. }
  85.  
  86. /* (4) isEmpty関数:スタックが空かどうかを判断 */
  87. int isEmpty(void) {
  88. return (sp == 0);
  89. }
  90.  
  91. /* (5) isFull関数:スタックが満杯かどうかを判断 */
  92. int isFull(void) {
  93. return (sp == SIZE);
  94. }
  95.  
  96. /* (6) pop関数:データをスタックから取り出す */
  97. double pop(void) {
  98. if (!isEmpty()) {
  99. sp--;
  100. return stack[sp];
  101. } else {
  102. printf("Stack Underflow\n");
  103. return 0;
  104. }
  105. }
  106.  
  107. /* (7) push関数:データをスタックに格納する */
  108. void push(double value) {
  109. if (!isFull()) {
  110. stack[sp] = value;
  111. sp++;
  112. } else {
  113. printf("Stack Overflow\n");
  114. }
  115. }
Success #stdin #stdout 0s 5316KB
stdin
Standard input is empty
stdout
1:+, 2:-, 3:*, 4:/, 5:Push, 9:Answer -> Stack is empty