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

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

新規登録して質問してみよう
ただいま回答率
85.50%
アルゴリズム

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

907閲覧

c++でスタックを用いて括弧の対応付けを行うプログラムを作っていますが、正しく対応付けされません。

nico030302

総合スコア1

アルゴリズム

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/07/17 02:12

c++でスタックを用いて括弧の対応付けを行うプログラムを作っています。

例えば()()と入力された場合、1122
(())と入力された場合、1221と出力するようにしたいです。

解法
左から順番に括弧を読み込んでいく
𝑖番目の左括弧を読み込んだら、スタックに𝑖をpushし、𝑖を出力する
右括弧を読み込んだら、スタックからpopしたものを出力する

()()と入力すると1133となってしまいます。
正しく1122とさせるにはどう変更すればよいですか。

#include <stdio.h> #include <iostream> #include <stack> #include <string.h> using namespace std; int main(){ stack<int> test; string str; cout << "括弧を入力" << endl; cin >> str; int n; n = str.length(); for(int i = 0 ; i < n ; i++){ if (str[i] == '('){ test.push(i+1); cout << i+1 << "をpushしました" << endl; } else if (str[i]==')'){ cout << test.top() << "をpopしました" << endl; } else{ cout << "エラー:括弧以外が入力されました" << endl; } } }

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

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

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

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

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

can110

2022/07/17 02:22

出力される数字の意味について記載ください。 (たとえば「()()」のときなぜ「1122」となるのか)
guest

回答3

0

コードを拝見したところ、標準入力から受け取った string str のインデックスと括弧の対応付けの番号(?)を混同しているように見えます。
まずは str のインデックスと括弧の対応付けの番号(?)を同一の i で処理するのではなく、それぞれ別の変数を定義してはどうでしょうか?

投稿2022/07/17 13:41

YUKI_DAYO

総合スコア19

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

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

0

ベストアンサー

C++

1#include <stdio.h> 2#include <iostream> 3#include <stack> 4using namespace std; 5 6int main(){ 7 stack<int> test; 8 string str; 9 cout << "括弧を入力" << endl; 10 cin >> str; 11 12 int parentheses = 0; 13 for ( char ch : str ){ 14 if ( ch == '(' ) { 15 test.push(++parentheses); 16 cout << parentheses << "をpushしました" << endl; 17 } else 18 if ( ch == ')' ) { 19 if ( !test.empty() ) { 20 cout << test.top() << "をpopしました" << endl; 21 test.pop(); 22 } 23 } 24 else{ 25 cout << "エラー:括弧以外が入力されました" << endl; 26 } 27 } 28}

投稿2022/07/17 03:52

episteme

総合スコア16614

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

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

nico030302

2022/10/14 11:32

お返事遅くなりすみません. とても助かりました. ありがとうございました.
guest

0

for文により、右カッコも左カッコも同じようにカウントアップしてしまうからですね。
カッコのカウントをループカウンタと別に管理する必要があるでしょう。

投稿2022/07/17 02:55

swordone

総合スコア20649

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問