9012
2806 ワード
質問する
括弧文字列(Parentosis String,PS)は、2つの括弧記号「(」と「)」からなる文字列である.ここで、括弧形状が正しい文字列を正しい括弧文字列(Valid PS,VPS)と呼ぶ.括弧の「()」文字列をデフォルトVPSと呼びます.xがVPSであれば、括弧に入れる新しい文字列「(x)」もVPSとなります.また,2つのVPSxとyを接続した新しい文字列xyもVPSとなる.例えば、「()()()」「((())」はVPSであるが、「()(」()、「()()())」と「(((()」はVPSではなく文字列である.
入力した括弧文字列がVPSであるかどうかを判断し、結果をYESとNOとして表す必要があります.
入力
入力データは標準入力を採用している.T個のテストデータとして入力します.入力された最初の行は、入力データの数を表す整数Tを与える.各テストデータの最初の行にはカッコ文字列があります.カッコ文字列の長さは2または50以下です.
しゅつりょく
力は標準出力を使用します.カッコ文字列が正しいカッコ文字列(VPS)である場合は、「YES」または「NO」を行単位で出力します.
に答える
最初は順番に解けていました.
だから最初は文字列を消して、ペアを組むと消してしまいますが、不思議なことに、最初の文字は消してはいけません.スキップします.(
最後に思いついたのはスタック構造ですこのテーマはスタック問題で、私はすぐに考えました.この最初も試行錯誤を経験しました.
グーグルを試してみると、以下の注意点がありました.
空のスタックの場合、top演算とpop演算の結果は定義されていないため、エラーは発生しません.エラーが発生しなくても、プログラムが中断する可能性が高い
Nullスタックの場合
コード#コード#
括弧文字列(Parentosis String,PS)は、2つの括弧記号「(」と「)」からなる文字列である.ここで、括弧形状が正しい文字列を正しい括弧文字列(Valid PS,VPS)と呼ぶ.括弧の「()」文字列をデフォルトVPSと呼びます.xがVPSであれば、括弧に入れる新しい文字列「(x)」もVPSとなります.また,2つのVPSxとyを接続した新しい文字列xyもVPSとなる.例えば、「()()()」「((())」はVPSであるが、「()(」()、「()()())」と「(((()」はVPSではなく文字列である.
入力した括弧文字列がVPSであるかどうかを判断し、結果をYESとNOとして表す必要があります.
入力
入力データは標準入力を採用している.T個のテストデータとして入力します.入力された最初の行は、入力データの数を表す整数Tを与える.各テストデータの最初の行にはカッコ文字列があります.カッコ文字列の長さは2または50以下です.
しゅつりょく
力は標準出力を使用します.カッコ文字列が正しいカッコ文字列(VPS)である場合は、「YES」または「NO」を行単位で出力します.
に答える
最初は順番に解けていました.
(
と)
の個数がペアリングされていればyesかnoが出力されると思いました())(()
の場合、noは出力する必要がありますが、yes出力のため、問題が発生しました.だから最初は文字列を消して、ペアを組むと消してしまいますが、不思議なことに、最初の文字は消してはいけません.スキップします.(
((()))
の場合、(
しか残っておらず、全て消してしまいます…)最後に思いついたのはスタック構造ですこのテーマはスタック問題で、私はすぐに考えました.この最初も試行錯誤を経験しました.
if (str[j] == '(')
arr.push(str[j]);
else
{
if (!arr.empty()){
if (arr.top() == '(')
arr.pop();
}
else
{
arr.push(str[j]);
break;
}
}
この条件でstr[j]=)
の場合if (arr.top() == '(')
arr.pop();
}
else
{
arr.push(str[j]);
break;
}
トップ()が(
であれば、それを削除したり、対応する文字を入れたりして、繰り返し文から離れます.こんなことをしてはいけないと思っていたのに、何か問題があったのか.グーグルを試してみると、以下の注意点がありました.
空のスタックの場合、top演算とpop演算の結果は定義されていないため、エラーは発生しません.エラーが発生しなくても、プログラムが中断する可能性が高い
Nullスタックの場合
(
に遭遇した場合、top()を返します.Nullスタックであるため、プログラムが中断される可能性があります.そこでempty()を用いてスタックが空であるかどうかを確認した.コード#コード#
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
int n;
string str;
scanf("%d", &n);
for (int i = 0 ; i < n ; i++){
cin >> str;
stack<char> arr;
for (int j = 0 ; j < str.length() ; j++){
if (str[j] == '(')
arr.push(str[j]);
else
{
if (!arr.empty()){
if (arr.top() == '(')
arr.pop();
}
else
{
arr.push(str[j]);
break;
}
}
}
if (arr.size() == 0)
cout << "YES" << '\n';
else
cout << "NO" << '\n';
}
}
Reference
この問題について(9012), 我々は、より多くの情報をここで見つけました https://velog.io/@lsmmay322/백준-9012テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol