괄호 문자열이 주어지면 올바른 괄호 문자열인지 판단하는 프로그램을 작성하시오.
올바른 괄호 문자열이란 여는 괄호와 닫는 괄호의 짝이 맞고, 포함 관계에 문제가 없는 문자열을 말한다.
예를 들어, )()( 인 경우 여는 괄호와 닫는 괄호의 짝이 맞지 않으므로 올바른 괄호 문자열이 아니다.
(()())인 경우 괄호의 짝이 맞고 포함 관계가 맞으므로 올바른 괄호 문자열이다.
입력
'('와 ')'로 이루어진 50,000글자 이하의 괄호 문자열이 입력된다.
문자열 중간에 공백이나 다른 문자는 포함되지 않는다.
출력
올바른 괄호 문자열이면 'good', 아니면 'bad'를 출력한다.
#include <iostream>
using namespace std;
enum { eMaxCount = 50000, eInvalid = -1 };
class Stack
{
public:
Stack()
: muTopIndex(0u)
, StackSize(0)
{
}
void Push(int _iData)
{
if (eMaxCount <= muTopIndex)
{
cout << "Stack overflow!" << endl;
return;
}
++StackSize;
miarrData[muTopIndex++] = _iData;
}
bool IsEmpty(void)
{
return 0 == muTopIndex;
}
int Size()
{
return StackSize;
}
int Top(void)
{
if (true == IsEmpty())
{
cout << "Stack underflow!" << endl;
return eInvalid;
}
return miarrData[muTopIndex];
}
void Pop(void)
{
if (true == IsEmpty())
{
cout << "Stack underflow!" << endl;
return;
}
--StackSize;
muTopIndex--;
}
private:
int miarrData[eMaxCount];
unsigned int muTopIndex;
int StackSize;
};
int main()
{
int i = 0;
char GetChar[eMaxCount] = {0};
Stack* StackStorage = new Stack();
cin >> GetChar;
if ('(' != GetChar[0])
{
std::cout << "bad";
return 0;
}
while ('\0' != GetChar[i])
{
if ('(' == GetChar[i])
{
StackStorage->Push(GetChar[i]);
}
else
{
if (false == StackStorage->IsEmpty() && ')' == GetChar[i])
{
StackStorage->Pop();
}
else
{
std::cout << "bad";
return 0;
}
}
++i;
}
if (true == StackStorage->IsEmpty())
{
std::cout << "good";
return 0;
}
else
{
std::cout << "bad";
return 0;
}
}