回答編集履歴

1

追記

2020/11/24 11:55

投稿

katoy
katoy

スコア22324

test CHANGED
@@ -93,3 +93,151 @@
93
93
  実行例
94
94
 
95
95
  ![イメージ説明](4f94fa93c7b18c7a35c0137f635adb75.png)
96
+
97
+
98
+
99
+
100
+
101
+ 追記 2020-11-24
102
+
103
+
104
+
105
+ 上のコードでは、stack の オーバーフロー、アンダーフローをチェックせずに処理が進んでいました。
106
+
107
+ そのチェックを追加し、コメントで質問があった無駄な開業 (show_stack() 呼び出し)をしないように変更しました。
108
+
109
+
110
+
111
+ c.c
112
+
113
+ ```c
114
+
115
+ #include <stdio.h>
116
+
117
+ #include <stdlib.h>
118
+
119
+ #include <string.h>
120
+
121
+ #include <ctype.h>
122
+
123
+
124
+
125
+ #define STACK_SIZE (100)
126
+
127
+ int stk[STACK_SIZE];
128
+
129
+ int stk_ptr = 0;
130
+
131
+
132
+
133
+ void show_stack() {
134
+
135
+ printf("[ ");
136
+
137
+ for (int i = 0; i < stk_ptr; i++) {
138
+
139
+ printf("%d ", stk[i]);
140
+
141
+ }
142
+
143
+ printf("]\n");
144
+
145
+ }
146
+
147
+
148
+
149
+ int pop() {
150
+
151
+ if (stk_ptr < 1) {
152
+
153
+ printf("#--- Stack underflow!\n");
154
+
155
+ return 0;
156
+
157
+ }
158
+
159
+ return stk[--stk_ptr];
160
+
161
+ }
162
+
163
+
164
+
165
+ void push(int val) {
166
+
167
+ if (stk_ptr >= STACK_SIZE) {
168
+
169
+ printf("#--- Stack overflow!\n");
170
+
171
+ }
172
+
173
+ stk[stk_ptr++] = val;
174
+
175
+ }
176
+
177
+
178
+
179
+ int main() {
180
+
181
+ char s[100];
182
+
183
+
184
+
185
+ while (scanf("%s", s) != EOF) {
186
+
187
+ if (isdigit(s[0])) {
188
+
189
+ push(atoi(s));
190
+
191
+ } else if (s[0] == '=') {
192
+
193
+ // int val = pop();
194
+
195
+ // printf("val = %d\n", val);
196
+
197
+ continue;
198
+
199
+ } else {
200
+
201
+ // 2項演算子
202
+
203
+ int b = pop();
204
+
205
+ int a = pop();
206
+
207
+ if (s[0] == '+') {
208
+
209
+ push(a + b);
210
+
211
+ } else if (s[0] == '-') {
212
+
213
+ push(a - b);
214
+
215
+ } else if (s[0] == '*') {
216
+
217
+ push(a * b);
218
+
219
+ } else {
220
+
221
+ // エラー
222
+
223
+ }
224
+
225
+ }
226
+
227
+ show_stack();
228
+
229
+ }
230
+
231
+ return 0;
232
+
233
+ }
234
+
235
+
236
+
237
+ ```
238
+
239
+
240
+
241
+ 実行例
242
+
243
+ ![イメージ説明](d367185375ec169430c1ea5f311bce45.png)