質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

2372閲覧

スタックを用いた逆ポーランド記法計算機

harukawa0701

総合スコア0

C

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2021/08/20 13:47

前提・実現したいこと

スタックのデータ構造を用いて, 逆ポーランド記法で入力した文字列の計算を行うアルゴリズムを作成しました.
入力した文字列をchar型配列に格納し, for文で一文字ずつ読み込み, プッシュ・ポップ・演算を行います.

望まれる入出力は以下のようになります.
例1
入力:12+
出力:3
例2
入力:34+12-*
出力:-7

発生している問題

どのような入力に対しても0が返されます.

該当のソースコード

c

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#define MAX 10000 5int top; //スタックに入っているデータの数 6int st[MAX]; //スタック 7 8//push 9void push(int a) { 10top++; 11st[top]=a; 12} 13 14//pop 15int pop(){ 16top--; 17return st[top+1]; 18} 19 20int main(void){ 21char c[128]; //入力文字列 22char s; //数字のpushで使う 23int a,b; //演算のオペランド 24int size; //入力文字列の長さ 25scanf("%s",c); 26size = strlen(c); 27 28for(int i; i<size; i++){ 29if(c[i]=='+'){ //加算 30a=pop(); 31b=pop(); 32push(a+b); 33}else if(c[i]=='-'){ //減算 34b=pop(); 35a=pop(); 36push(a-b); 37}else if(c[i] == '*'){ //乗算 38a=pop(); 39b=pop(); 40push(a*b); 41}else{ 42s=c[i]; 43push(atoi(&s)); 44} 45} 46printf("%d",pop()); 47}

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

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

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

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

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

guest

回答2

0

C

1... 2int main(void){ 3 char c[128]; //入力文字列 4 char s[2]; //数字のpushで使う 5 int a,b; //演算のオペランド 6 int size; //入力文字列の長さ 7 scanf("%s",c); 8 size = strlen(c); 9 10 for(int i = 0; i<size; i++){ 11 if(c[i]=='+'){ //加算 12 a=pop(); 13 b=pop(); 14 push(a+b); 15 } else if (c[i]=='-') { //減算 16 b=pop(); 17 a=pop(); 18 push(a-b); 19 } else if(c[i] == '*') { //乗算 20 a=pop(); 21 b=pop(); 22 push(a*b); 23 } else { 24 s[0] = c[i]; 25 s[1] = '\0'; 26 push(atoi(s)); 27 } 28 } 29 printf("%d",pop()); 30}

投稿2021/08/20 14:04

episteme

総合スコア16612

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

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

0

自己解決

for文の条件式内の変数iを初期化していないことが原因でした. int i=0; i<size; i++とすると正常に動作しました.

投稿2021/08/20 13:57

harukawa0701

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問