큰 따옴표 처리
입력 되는 문자열에 대한 아래 요건을 만족하는 괄호 검사 프로그램을 만드시오.
- 큰 따옴표 사이에 대한 문자열 무시
- 괄호 닫기에 대해 문제가 없어야 함
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;
}
'CS+PS > data structure' 카테고리의 다른 글
[Stack] 스택 - STL을 이용한 미로찾기 (0) | 2023.07.04 |
---|---|
[Stack] 스택 - 수식 계산 프로그램 (0) | 2023.07.04 |
[Stack] 스택 - 주석 처리에서 괄호 검사 (0) | 2023.07.03 |
[Stack] 스택 - 작은 따옴표 처리 (0) | 2023.07.03 |
[Stack] 스택 - 괄호 짝 검사 (0) | 2023.07.03 |