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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

3回答

1082閲覧

スタックによる四則演算(逆ポーランド記法)の出力がおかしい

Qicken

総合スコア6

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2020/05/29 19:49

編集2020/05/29 20:05

前提・実現したいこと

スタックによる四則演算(逆ポーランド記法)の出力

発生している問題・エラーメッセージ

入力:12+34ー*
目的の出力:((1+2)*(3−4)を想定して)ー3
実際の出力:−99

該当のソースコード

using System; namespace ALDS13A { class Program { static int top; static int[] stacks; static void Push(int ch) { stacks[++top] = ch; } static int Pop() { top--; return stacks[top+1]; } static void Main(string[] args) { top = 0; stacks = new int[100]; int a, b; var str = "12+34-*"; foreach (var ch in str) { if (ch == '+') { a = Pop(); b = Pop(); Push(b + a); } else if (ch == '-') { a = Pop(); b = Pop(); Push(b - a); } else if (ch == '*') { a = Pop(); b = Pop(); Push(b * a); } else if (ch == '/') { a = Pop(); b = Pop(); Push(b / a); } else { Push(ch); } } Console.WriteLine(Pop()); } } }

補足情報(FW/ツールのバージョンなど)

環境:Visual Studio for mac (8.6.1(build 26))

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

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

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

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

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

hoshi-takanori

2020/05/29 22:56

Push(ch) で文字 '1' や '2' などを int に変換したものではなく、文字コードがそのまま push されているのでは。
guest

回答3

0

ベストアンサー

1をPushする際にログを仕込んだところ49でPushされていました。
ASCIIコードになっているようです。
Pushを以下に直したら意図した動作になりました。
Popも同じ要領でASCIIコード変換を入れてやればうまくいくと思います。

static void Push(int ch) { stacks[++top] = (char)ch; Console.WriteLine("Push=" + (char)ch); }

C# ASCIIコード変換あたりで検索してみると、色々ヒットすると思います。

投稿2020/05/29 23:26

pea

総合スコア453

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

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

Zuishin

2020/05/29 23:37

これで意図した動作になりますか?
YAmaGNZ

2020/05/29 23:48

push/popはスタック含めてintでの動作するようになっていますので変更する必要はないでしょう。 pushする時にcharではなくintを渡せばいいだけです。
pea

2020/05/29 23:50

失礼しました。 私の記載に謝りがあるようです intを渡せばいいだけのようです。 何にせよ投稿者の方で動作確認していただければと思います。
Qicken

2020/05/30 15:03

Conver.ToInt32(ch)にして渡しても結果は変わりませんでした。 どうやらchar型はASC llで変換されてしまうようです。 (そもそもなぜchar型をそのまま渡してしまっているのにエラーにならないのかも含めて謎です...)
Qicken

2020/05/31 10:28

解決しました。ご回答ありがとうございました。具体的なコードはまとめておきましたm(_ _)m
guest

0

VisualStudioを使ってるなら、ブレークポイントを設定して途中で実行を止め、変数の中身を参照することができます。
そうやって動作のおかしいところを探っていけばどうでしょう

で、入力は全部全角で行ってませんか?
コードでは半角文字を判定してるようですが


ああ(気がついた)、数字が文字コードのままpushされてますね
これどーにかしましょう

投稿2020/05/29 22:51

編集2020/05/29 22:55
y_waiwai

総合スコア88013

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

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

Qicken

2020/05/31 10:26

解決しました。ご回答ありがとうございましたm(_ _)m
guest

0

原因は数字がASCIIコードで渡されていたことで

Push(ch);

Push(Convert.ToInt32(ch.ToString()));

に変更して解決
なお、chがchar型のままだとASCIIコードになってしまう模様

投稿2020/05/30 15:07

編集2020/05/30 15:17
Qicken

総合スコア6

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

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

Zuishin

2020/05/30 22:39

どこが自己解決なんですか?
Qicken

2020/05/31 09:36

お気を悪くされてしまったのなら申し訳ありません。 回答者様の情報からASCIIコードで渡されているのが原因だと分かりましたが、 peaさんが最初に提示した方法自体は適切では無い事、y_waiwaiさんの回答では後から参照した人が具体的にコードをどうすれば解決するのかが分かりにくくなってしまうだろうと判断し、自己解決欄にて完結に纏めました。 しかし、現状ご指南頂いた方の知識を一方的に借りた形になってしうまうのでこの自己解決は適切では無いと改めて認識しました。 この場合どこに具体的な解決法を記述し、またどなたにベストアンサーを与えるのが適切でしょうか?
Zuishin

2020/05/31 10:13

具体的な解決方法は自分で回答してもいいし、質問を編集して追記してもいいですが、ベストアンサーは最も参考になった回答が適切だと思います。
Qicken

2020/05/31 10:29

適切なベストアンサーを選択し、具体的な解決方法は残しておきました。ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問