본문 바로가기
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 = (((((( ");    // remark

checkprintf(" right bracket = }}}}} ");

EOF

Sample Output

OK, Line_count : 2, bracket_count : 2

Sample Input

printf(" right bracket = }}}}} ");   /*

remark check  */

EOF

Sample Output

OK, Line_count : 2, bracket_count : 1

Sample Input

printf(" right bracket = }}}}} //");

printf(" right bracket = }}}}} "//);

EOF

Sample Output

Error, Line_count : 2, bracket_count : 1

 

정답:

#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;
    int j = 0; //주석진행됐으면 1,2 주석진행 안됐으면 0
    bool quotes = false;
    int a;
    int aa;
     
    a = Str.length();
    for(int i=0; i<a; i++){
        if(j==1 || j==2){  //주석 진행이 됐다면
            if(j==1){
                if(Str[i]=='\n'){
                    j=0;
                }
            }
            else if(j==2){
                if(Str[i]=='/'){
                    if(i-1>=0 && Str[i-1]=='*'){
                        j=0;
                    }
                }
            }
        }
        else if(j==0){
            if(quotes){ //큰따옴표가 열려있는 상태
                if (Str[i]=='\"'){
                    quotes=false;
                }
            }
            else{ //큰따옴표가 닫혀있는 상태 => ()짝맞추기
                if(Str[i] == '[' || Str[i] =='(' || Str[i] =='{'){
                    stack.push(Str[i]);
                    // cout<<Str[i]<<endl;
                }
                else if(Str[i] == ']' || Str[i]==')' || Str[i]=='}'){
                    if(stack.isEmpty()){
                        ans = "Error";
                        continue;
                    }
                    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;
                }
                 
                else if(Str[i]=='/'){
                    if(i-1>=0 && Str[i-1]=='/'){
                        j=1;
                    }
                }
                else if(Str[i]=='*'){
                    if(i-1>=0 && Str[i-1]=='/'){
                        j =2;
                    }
                }
            }
        }
    }
 
    if (stack.isEmpty()){
        ans = "OK";
    }
    else{
        ans = "Error";
    }
      
 
    cout << ans <<", Line_count : "<<cnt<<", bracket_count : "<<bc<<endl;
}
 
int main(){
    string Str,temp;
    int cnt =0;
    while(true){
        getline(cin,temp);
        if(temp=="EOF")break;
        cnt++;
        Str.append(temp);
        Str.append("\n");
        // cin.clear();
    }
    checkMatching(Str, cnt);
 
 
    return 0;
}