//http://i...content-available-to-author-only...e.com/AbO4tw
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <iterator>
#include <iomanip>
using namespace std;

vector<string> bracesExpressionExamples = {
	"({[{}]{}[]})",
	"({}}{[{}]{}[]})",
	"({[{}]{}[]}",
	"({[{}]{}]})",
	"({[{}{}[]})",
	"",
	"{}"
};

string openBrace = "({[";
string closeBrace = ")}]";

typedef map<char, char> otc;
const otc& openToCloseBrace(){
	static const otc o2c([](){
		otc o2c;
		transform(
			openBrace.begin(), openBrace.end(),
			closeBrace.begin(),
			inserter(o2c, o2c.begin()),
			[](const char open, const char close){return make_pair(open, close);}
		);
		return o2c;
	}());
	return o2c; 
}

bool checkBraces (const string& e){
	vector<char> s;
	for(const char b: e)
		if(string::npos!=openBrace.find(b))
			s.push_back(openToCloseBrace().at(b));
		else if(string::npos!=closeBrace.find(b) && (!s.empty()) && b==s.back())
			s.pop_back();
		else return false;
	return s.empty();
}

int main() {
	cout<<boolalpha;
	transform(
		bracesExpressionExamples.begin(),
		bracesExpressionExamples.end(),
		ostream_iterator<bool>(cout, "\n"),
		checkBraces);
	return 0;
}