본문 바로가기
CS+PS/data structure

[Stack] 스택 - 큰 따옴표 처리

by SolaBreeze 2023. 7. 3.

큰 따옴표 처리

입력 되는 문자열에 대한 아래 요건을 만족하는 괄호 검사 프로그램을 만드시오.

  • 큰 따옴표 사이에 대한 문자열 무시
  • 괄호 닫기에 대해 문제가 없어야 함

INPUT

”EOF“를 입력 받을 때까지 문자열을 입력

OUTPUT

괄호 검사 성공 여부에 따라 출력문은 아래와 같고 오류 시 오류가 생긴 문장의 라인,문자까지만 인정

1) 성공 : OK, Line_count : (문장 수), bracket_count : **(괄호 짝 수)**

2) 오류 : Error, Line_count : (문장 수), bracket_count : (괄호 짝 수)

- 아래 main 함수를 참조하여 checkMatching() 함수를 만드시오.

int main(){

    std::string Str,temp;

    while(true){

        std::getline(std::cin,temp);

        if(temp=="EOF")break;

        Str.append(temp);

        Str.append("\n");

        std::cin.clear();

    }    checkMatching(Str);

return 0;

}

Sample Input

printf(" left bracket = (((((( ");printf(" right bracket = }}}}}} ");EOF

Sample Output

OK, Line_count : 2, bracket_count : 2

Sample Input

printf(" left bracket = (((((( );printf(" right bracket = }}}}}} ");EOF

Sample Output

Error, Line_count : 2, bracket_count : 0

 

정답:

#include <iostream>
#include <string>
using namespace std;

const int MAX_STACK_SIZE = 20;

class ArrayStack
{
    int top;    //요소 개수
    int data[MAX_STACK_SIZE]; //요소의 배열

public :
    ArrayStack(){top = -1;} //스택의 생성자
    //반환자가 bool 타입이기 때문에 return top==-1일때 True를 반환하고, top!=-1이면 False를 반환한다.
    bool isEmpty(){return top == -1;}
    bool isFull(){return top == MAX_STACK_SIZE-1;}

    void push(int e){
        //만약 스택이 가득 찼다면
        // if(isFull()) error ("스택 포화 에러");
        data[++top] =e; //top에 먼저 1 더하고, 그 자리에 새로운 e값 넣기
    }

    int pop(){
        return data[top--];
    }

    int peek(){
        return data[top];
    }

    void display(){
        printf("[스택 항목의 수 = %2d] ==> ", top+1);
        for(int i=0; i<=top; i++){
            printf("<%2d>", data[i]);
            printf("\n");
        }
    }
};

void checkMatching(string Str, int cnt){
    ArrayStack stack;
    string ans;
    int bc = 0;
    bool quotes=false;
    int a;
    int aa;

    a = Str.length();
    for(int i=0; i<a; i++){
        if(quotes){ //큰따옴표가 열려있는 상태
            if (Str[i]=='\"'){
                quotes=false;
            }
        }
        else{ //큰따옴표가 닫혀있는 상태 => ()짝맞추기
            if(Str[i] == '[' || Str[i] =='(' || Str[i] =='{'){
                stack.push(Str[i]);
            }
            else if(Str[i] == ']' || Str[i]==')' || Str[i]=='}'){
                if(stack.isEmpty()){
                ans = "Error";
                }
                else{
                    int prev = stack.peek();
                    if((Str[i] == ']'&& prev !='[')||(Str[i] == ')'&& prev !='(')||(Str[i] == '}'&& prev !='{')){
                        ans = "Error";
                        continue;
                    }
                    bc++;
                    stack.pop();
                }
            }
            else if(Str[i]=='\"'){
                quotes= true;
            }
        }
    }

    if (stack.isEmpty()){
        ans = "OK";
    }
    else{
        ans = "Error";
    }
     

    cout << ans <<", Line_count : "<<cnt<<", bracket_count : "<<bc<<endl;

}

int main(){
    string Str,temp;
    int cnt;
    while(true){
        getline(cin,temp);
        if(temp=="EOF")break;
        cnt++;
        Str.append(temp);
        // Str.append("\n");
        // cin.clear();
    }
    checkMatching(Str, cnt);
    return 0;
}