https://www.acmicpc.net/problem/9012
Stack이란,
LIFO(Last In First Out)
마지막에 들어간 원소가 가장 먼저 나온다.
예를 들면,
높이 쌓여진 접시 중 가장 밑에 접시를 꺼내기는 쉽지 않다.
이때 쉽게 꺼내기 위해서는 맨 꼭대기에 접시부터
차례대로 꺼내면 쉽게 가장 밑에 접시를 꺼낼수 있다.
관련 함수#include <stack> : 전처리기 std::stack<Type> 변수명; : 선언 변수명.top() : 스택의 가장 위에 있는 원소를 리턴한다. 변수명.push(데이터) : 스택에 데이터를 집어 넣어 쌓아 올린다. 이전에 있던 원소는 그 아래로 내려간다. 변수명.pop() : 스택의 가장 위에 있는 원소를 꺼낸다. 아래에 있던 원소가 top이 된다. 변수명.empty(); : 스택이 비어있으면 1을 리턴한다. 변수명.size(); : 스택의 크기를 리턴
- '(' 가 오면 스택에 push한다.
- ')'가 오면 stack top을 확인한다.
- 이때 정상적인 괄호가 되려면 "()"가 되야한다.
- 만약,
1) stack이 비어있을 때 ')'가 오거나
2) 비정상적으로 종료되어 스택이 비어있지 않다면 NO, 그 외에는 YES
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
int num;
string str;
cin >> num;
for(int i = 0; i < num; i++)
{
stack<char> s;
cin >> str;
int j = 0;
bool flag = true;
while(str[j] != 0)
{
if(str[j] == '(')
s.push(str[j]);
else
{
if(str[j] == ')'){
if(!s.empty() && s.top() == '(')
s.pop();
else{
flag = false;
break;
}
}
}
j++;
}
if(flag && s.empty())
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}