[알고리즘 스터디] 2주차_스택_코드업 3129

·2022년 11월 6일
2

Algorithm Study

목록 보기
36/77
post-custom-banner

괄호 문자열이 주어지면 올바른 괄호 문자열인지 판단하는 프로그램을 작성하시오.
올바른 괄호 문자열이란 여는 괄호와 닫는 괄호의 짝이 맞고, 포함 관계에 문제가 없는 문자열을 말한다.
예를 들어, )()( 인 경우 여는 괄호와 닫는 괄호의 짝이 맞지 않으므로 올바른 괄호 문자열이 아니다.
(()())인 경우 괄호의 짝이 맞고 포함 관계가 맞으므로 올바른 괄호 문자열이다.

입력
'('와 ')'로 이루어진 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;
    }
}
post-custom-banner

0개의 댓글