[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++로 쉽게 풀어쓴 자료구조
'C++ > C++로 쉽게 풀어쓴 자료구조' 카테고리의 다른 글
C++로 쉽게 풀어쓴 자료구조 연습문제 4-8 (0) | 2017.09.27 |
---|---|
C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 4 (7) | 2017.09.27 |
C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 2(2) (0) | 2017.09.20 |
C++/C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 2(1) (0) | 2017.09.20 |
C++로 쉽게 풀어쓴 자료구조 2장 연습문제 (2) | 2017.09.19 |