혜랑's STORY

[BOJ_C++] 9012번 : 괄호 본문

무지성 공부방/알고리즘 해결

[BOJ_C++] 9012번 : 괄호

hyerang0125 2021. 3. 26. 13:10

학교 과제와 비슷해서 풀어보았다. 저번에 엄청 틀렸었는데 이번엔 맞아서 기분 좋네 ㅎㅅㅎ

- 풀이

#include <iostream>
#include <strstream>
#include <cctype>
using namespace std;

#define LINESIZE 1000

struct Stack {
	char* store;
	int capacity;
	int top;
};

int create(Stack& s, int size = 100) {
	s.capacity = size;
	s.top = 0;
	return (s.store = new char[size]) != 0;
}

// If the stack is full, then push val onto the stack s and return 1,
// otherwise simply return 0 to indicate a failure of the push operation
void push(Stack& s, char val) {
	if (s.top < s.capacity)
		s.store[s.top++] = val;
	else
		cerr << "Error: stack full, can't push" << endl;
}

char pop(Stack& s) {
	if (s.top > 0)
		return s.store[--s.top];
	else {
		cerr << "Error: pop from an empty stack" << endl;
		return 0;
	}
}

int isempty(Stack& s) {
	return s.top == 0;
}

void check_balance(char line[]) {
	char  c, temp;
	Stack expr;
	create(expr);
	istrstream is(line);
	bool flag = true;

	while (is >> c) {

		if (c == '(') //열린 기호일 때 스택에 삽입
			push(expr, c);
		else if ((c == ')') && !isempty(expr)) { //스택이 비어있지 않을 때 닫는 기호
			temp = pop(expr);

			if ((c == ')' && temp == '('))
				flag = true;
			else {
				flag = false;
				break;
			}
		}
		else { //스택이 비어있을 때 닫는 기호
			flag = false;
			break;
		}

	}
	if (!isempty(expr)) //문자열이 끝나고도 스택에 남아 있는 경우
		flag = false;

	if (!flag)
		cout <<"NO" << endl;
	else
		cout << "YES" << endl;
}

int main() {
	int n;
	char line[LINESIZE], c;
	string str;
	cin >> n;

	for (int i = 0; i < n; i++) {
		cin >> line;
		check_balance(line);
	}
	
}

'무지성 공부방 > 알고리즘 해결' 카테고리의 다른 글

[BOJ_C++] 5692번 : 팩토리얼 진법  (0) 2021.06.30
[BOJ_C++] 1654번 : 랜선 자르기  (0) 2021.06.27
[BOJ_C++] 2164번 : 카드2  (0) 2021.03.11
[BOJ_C++] 11399번 : ATM  (0) 2021.03.11
[BOJ_C++] 2798번 : 블랙잭  (0) 2021.03.03