🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

323閲覧

逆ポーランド法の計算

puro

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/11/23 17:12

編集2020/11/23 17:22

前提・実現したいこと

逆ポーランド法での計算をして、計算結果と計算過程のスタックの要素を出力したい。

計算結果は出せたのですが、計算過程のスタックの要素の出力の仕方が分かりません。

どのように書いたらいいでしょうか。

該当のソースコード

#include<stdio.h> #include<stdlib.h> #include<string.h> int main(){ int x; char s[100]; int stk[100]; int stk_ptr = 0; int a, b; while( scanf("%s", s) != EOF ){ if ( s[0] == '+' ){ b = stk[--stk_ptr]; a = stk[--stk_ptr]; stk[stk_ptr++] = a + b; } else if ( s[0] == '-' ){ b = stk[--stk_ptr]; a = stk[--stk_ptr]; stk[stk_ptr++] = a - b; } else if ( s[0] == '*' ){ b = stk[--stk_ptr]; a = stk[--stk_ptr]; stk[stk_ptr++] = a * b; } else { x = atoi(s); stk[stk_ptr++] = x; } } printf("%d\n", stk[0]); return 0; }

補足情報

入力例:
10 5 + 10 5 + * =

出力例:
10
10 5
15
15 10
15 10 5
15 15
225
(改行してこの行で終了)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/11/23 17:19

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答1

0

c.c

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <ctype.h> 5 6void show_stack(int * stack, int size) { 7 for (int i = 0; i < size; i++) { 8 printf("%d ", stack[i]); 9 } 10 printf("\n"); 11} 12 13int main() { 14 int x; 15 char s[100]; 16 int stk[100]; 17 int stk_ptr = 0; 18 int a, b; 19 20 while (scanf("%s", s) != EOF) { 21 if (isdigit(s[0])) { 22 x = atoi(s); 23 stk[stk_ptr++] = x; 24 } else { 25 b = stk[--stk_ptr]; 26 a = stk[--stk_ptr]; 27 if (s[0] == '+') { 28 stk[stk_ptr++] = a + b; 29 } else if (s[0] == '-') { 30 stk[stk_ptr++] = a - b; 31 } else if (s[0] == '*') { 32 stk[stk_ptr++] = a * b; 33 } else if (s[0] == '=') { 34 } else { 35 // エラー 36 } 37 } 38 show_stack(stk, stk_ptr); 39 } 40 return 0; 41} 42

実行例
イメージ説明

追記 2020-11-24

上のコードでは、stack の オーバーフロー、アンダーフローをチェックせずに処理が進んでいました。
そのチェックを追加し、コメントで質問があった無駄な開業 (show_stack() 呼び出し)をしないように変更しました。

c.c

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <ctype.h> 5 6#define STACK_SIZE (100) 7int stk[STACK_SIZE]; 8int stk_ptr = 0; 9 10void show_stack() { 11 printf("[ "); 12 for (int i = 0; i < stk_ptr; i++) { 13 printf("%d ", stk[i]); 14 } 15 printf("]\n"); 16} 17 18int pop() { 19 if (stk_ptr < 1) { 20 printf("#--- Stack underflow!\n"); 21 return 0; 22 } 23 return stk[--stk_ptr]; 24} 25 26void push(int val) { 27 if (stk_ptr >= STACK_SIZE) { 28 printf("#--- Stack overflow!\n"); 29 } 30 stk[stk_ptr++] = val; 31} 32 33int main() { 34 char s[100]; 35 36 while (scanf("%s", s) != EOF) { 37 if (isdigit(s[0])) { 38 push(atoi(s)); 39 } else if (s[0] == '=') { 40 // int val = pop(); 41 // printf("val = %d\n", val); 42 continue; 43 } else { 44 // 2項演算子 45 int b = pop(); 46 int a = pop(); 47 if (s[0] == '+') { 48 push(a + b); 49 } else if (s[0] == '-') { 50 push(a - b); 51 } else if (s[0] == '*') { 52 push(a * b); 53 } else { 54 // エラー 55 } 56 } 57 show_stack(); 58 } 59 return 0; 60} 61

実行例
イメージ説明

投稿2020/11/23 19:51

編集2020/11/24 11:55
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

puro

2020/11/23 20:13

ありがとうございます! 出力の際に最後に改行ができてしまうのですがどうしたら消えますか?
Daregada

2020/11/24 05:07

show_stackで改行している部分を「sizeが0より大きければ」改行するように書き換えればいいんじゃないかね。
katoy

2020/11/24 11:55

バグ修正したものを回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問