본문 바로가기
Quality control (Univ. Study)/Data structure

ArrayStack(1)

by 생각하는 이상훈 2022. 11. 18.
728x90

괄호 매칭

ArrayStack을 이용하여 괄호 매칭 시스템을 만들어보았다.

//ArrayStack Header Source Code

#ifndef ARRAYSTACK_H
#define ARRAYSTACK_H

#include <iostream>


using namespace std;

class StackEmpty {
public:
    StackEmpty(const string& err) { }
};

class StackFull {
public:
    StackFull(const string& err) { }
};


template <typename E>
class ArrayStack {
    enum { DEF_CAPACITY = 100 };		// default stack capacity
public:
    ArrayStack(int cap = DEF_CAPACITY);		// constructor from capacity
    int size() const;				// number of items in the stack
    bool empty() const;				// is the stack empty?
    const E& top() const throw(StackEmpty);	// get the top element
    void push(const E& e) throw(StackFull);	// push element onto stack
    void pop() throw(StackEmpty);		// pop the stack
    // ...housekeeping functions omitted
private:                                	// member data
    E* S;					// array of stack elements
    int capacity;				// stack capacity
    int t;					// index of the top of the stack
};


template <typename E> ArrayStack<E>::ArrayStack(int cap)
    : S(new E[cap]), capacity(cap), t(-1) { }	// constructor from capacity

template <typename E> int ArrayStack<E>::size() const
{
    return (t + 1);
}				// number of items in the stack

template <typename E> bool ArrayStack<E>::empty() const
{
    return (t < 0);
}				// is the stack empty?

template <typename E>				// return top of stack
const E& ArrayStack<E>::top() const throw(StackEmpty) {
    if (empty()) throw StackEmpty("Top of empty stack");
    return S[t];
}


template <typename E>				// push element onto the stack
void ArrayStack<E>::push(const E& e) throw(StackFull) {
    if (size() == capacity) throw StackFull("Push to full stack");
    S[++t] = e;
}

template <typename E>				// pop the stack
void ArrayStack<E>::pop() throw(StackEmpty) {
    if (empty()) throw StackEmpty("Pop from empty stack");
    --t;
}


#endif
#include <iostream>
#include "ArrayStack.h"
using namespace std;

//괄호 매칭함수
int bracketmatching(ArrayStack<char>& stack, string expression) {
	//범위기반 반복문
	for (const char& pair : expression) {
		//괄호 종류에 따라 분류
		switch (pair) {
		//open bracket의 경우
		case '(': case '{': case '[':
			stack.push(pair);	//stack에 문자를 입력
			break;	//반복문 종료

		//close bracket의 경우
		case ')': case '}': case ']':
			if (stack.empty()) {	//stack이 비어있으면
				cout << "false" << endl;	//false출력
				return 0;	//함수 종료
			}

			//stack이 비어있지 않다면
			char open_bracket = stack.top();	//open_bracket에 stack의 top을 입력
			stack.pop();		//해당 값은 pop
            //입력받은 close bracket과 stack에 있던 open bracket을 비교
			if (open_bracket == '(' and pair != ')' or
				open_bracket == '{' and pair != '}' or
				open_bracket == '[' and pair != ']') {	
				// (), {}, [] 세트가 아닌경우
				cout << "false" << endl;	//false출력
				return 0;	//함수 종료
			}
			break;	//반복문 종료
		}
	}
	//반복문 종료후
	if (!stack.empty()) {		//stack에 값이 남아있다면
		cout << "false" << endl;	//false출력
		return 0;
	}
	else {				//stack이 비어있다면
		cout << "true" << endl;		//true출력
		return 0;
	}
}

int main() {
	ArrayStack<char> bracket_stack;
	bracketmatching(bracket_stack, "(1+2)((3*4)){([( )])}");
	bracketmatching(bracket_stack, "((( )((1+2)){([(3+4 )])}");
	bracketmatching(bracket_stack, ")(( )){([(a+b )])}");
	bracketmatching(bracket_stack, "({[c/d])}");
	cout << endl << "이상훈 12211813" << endl;
	return 0;
}

open bracket은 계속 stack에 넣어두고 close bracketstacktop과 매칭을 하여 같은 형식의 set일 경우 toppop해주어 set가 있는 bracketstack에서 제거 해주는 것이다. 만약 모든 bracket이 제대로 matching되어 있어서 set가 딱 맞게 식에 존재한다면 stack에 남아있는 open bracket은 없다. 따라서 stackempty하면 bracket matching이 제대로 되되어있는 것으로 판단할 수 있고 stackempty하지 않다면 bracket이 제대로 matching되어있지 않다는 것으로 판단할 수 있다.


 

728x90

'Quality control (Univ. Study) > Data structure' 카테고리의 다른 글

ArrayStack(3)  (0) 2022.11.20
ArrayStack(2)  (0) 2022.11.19
자료구조론(5)  (1) 2022.10.06
자료구조론(4)  (1) 2022.10.03
자료구조론(3)  (0) 2022.09.26