9012


質問する
括弧文字列(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';
    }
}