C++/C++로 쉽게 풀어쓴 자료구조

C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 3

꾸준함. 2017. 9. 23. 13:17

[ArrayStack.h]

/*

C++ 배열로 구현한 int 스택 클래스

*/

#include <iostream>

#include <cstdlib>

using namespace std;

 

//오류 처리 함수

inline void error(char *message)

{

        cout << message << endl;

        exit(1);

}

 

const int MAX_STACK_SIZE = 20; //스택의 최대 크기 설정

 

class ArrayStack

{

private:

        int top; //요소의 개수

        int data[MAX_STACK_SIZE]; //요소의 배열

public:

        ArrayStack()

        {

               top = -1; //스택 생성자

        }

        ~ArrayStack()

        {

        }

        bool isEmpty()

        {

               return top == -1;

        }

        bool isFull()

        {

               return top == MAX_STACK_SIZE - 1;

        }

        void push(int e) //맨위에 항목 삽입

        {

               if (isFull())

                       error("스택 포화 에러");

               data[++top] = e;

        }

        int pop() //맨 위의 요소를 삭제하고 반환

        {

               if (isEmpty())

                       error("스택 공백 에러");

               return data[top--];

        }

        int peek() //삭제하지 않고 요소 반환

        {

               if (isEmpty())

                       error("스택 공백 에러");

               return data[top];

        }

        void display() //스택 내용을 화면에 출력

        {

               cout << "[스택 항목의 수 = " << top + 1 << "] ==> ";

               for (int i = 0; i <= top; i++)

                       cout << "<" << data[i] << "> ";

               cout << endl;

        }

};

 

[CheckMatching.cpp]

/*

괄호 검사 프로그램

 

(1) CheckMatching.cpp의 검사 결과 괄호 닫기의 문제가 발생했다.

    이것은 작은 따옴표 처리를 하지 않았기 때문이다.

        작은 따옴표를 처리하여 이 파일에서도 괄호 닫기 검사가 성공할 수 있도록 함수를 수정하라

(2) 작은따옴표 처리 중에서 이스케이프 시퀀스 문자('\n', '\\' )에 대해서도 정상적인 처리가

    될 수 있도록 수정하라

(3) 큰 따옴표 처리 기능을 추가하라. 다음 문장은 괄호 닫기에 문제가 없다고 판단되어야한다

(4) 주석 처리된 부분에 대해서는 괄호 검사를 하지 않도록 프로그램을 수정하라

*/

#include "ArrayStack.h"

 

//주어진 파일을 읽어 괄호 매칭을 검사를 하고 결과를 출력하는 함수

bool checkMatching(char *filename)

{

        FILE *fp = fopen(filename, "r");

        if (fp == NULL)

               error("Error: 파일 존재하지 않습니다.\n");

 

        int nLine = 1; //읽은 라인의 개수

        int nChar = 0; //읽은 문자 개수

        ArrayStack stack; //스택 개체

        char ch;

        bool quotation=false, bigQuot=false; //작은 따옴표, 큰따옴표

        bool note = false; //주석

 

        while ((ch = getc(fp)) != EOF)

        {

 

               if (ch == '\/' && note == false && quotation == false) //작은따옴표에 있는 / 예외

                       note = true;

 

               if (ch == '\'' && quotation == true)

                       quotation = false; //처음 작은따옴표를 만나면 작은 따옴표가 시작되었다고 표시하기 위해 true

               else if (ch == '\'')

                       quotation = true; //두번째로 만나면 작은 따옴표가 끝났다고 표시하기 위해 false

 

               if (ch == '\"' && bigQuot == true)

                       bigQuot = false; //처음 큰 따옴표를 만나면 큰 따옴표가 시작되었다고 표시하기 위해 true

               else if (ch == '\"')

                       bigQuot = true; //두번째로 만나면 큰 따옴표가 끝났다고 표시하기 위해 false

 

               if ((ch == '[' || ch == '(' || ch == '{') && quotation == false && bigQuot == false && note == false) //주석이 아니고 작은 따옴표, 큰 따옴표 내에 있는 괄호가 아니라면

                       stack.push(ch);

 

               if ((ch == ']' || ch == ')' || ch == '}') && quotation == false && bigQuot == false && note == false) //주석이 아니고 마찬가지로 작은 따옴표, 큰 따옴표 내에 있는 괄호가 아니라면

               {

                       char prev = stack.pop();

                       if ((prev != '[' && ch == ']') || (prev != '(' && ch == ')') || (prev != '{' && ch == '}'))

                              break;

               }

 

               if (ch == '\n') //개행되었으므로 주석에서 벗어났다고 간주

               {

                       nLine++;

                       note = false;

               }

               nChar++;

        }

        fclose(fp);

        cout << "[" << filename << "] 파일 검사결과" << endl;

        if (!stack.isEmpty())

               cout << "Error: 문제발견!(라인수=" << nLine << ", 문자수=" << nChar << ")" << endl;

        else

               cout << " OK: 괄호닫기정상(라인수=" << nLine << ", 문자수=" << nChar << ")" << endl << endl;

        return stack.isEmpty();

}

 

int main(void)

{

        checkMatching("ArrayStack.h");

        checkMatching("CheckMatching.cpp");

        cout << "왼쪽 괄호= (" << endl; //왼쪽 괄호는 (

        return 0;

}



개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] C++로 쉽게 풀어쓴 자료구조

반응형