parent
122e4ac486
commit
f9cadf3435
@ -0,0 +1,6 @@ |
|||||||
|
cmake_minimum_required(VERSION 3.21) |
||||||
|
project(balanced_brackets) |
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 14) |
||||||
|
|
||||||
|
add_executable(balanced_brackets main.cpp) |
@ -0,0 +1,177 @@ |
|||||||
|
#include <iostream> |
||||||
|
#include <fstream> |
||||||
|
#include <vector> |
||||||
|
#include <array> |
||||||
|
#include <algorithm> |
||||||
|
|
||||||
|
template<typename T> |
||||||
|
class Stack { |
||||||
|
private: |
||||||
|
size_t _len; |
||||||
|
std::vector<T> _data; |
||||||
|
public: |
||||||
|
explicit Stack(size_t alloc_size = 128); |
||||||
|
|
||||||
|
size_t push(T elem); |
||||||
|
|
||||||
|
T pop(); |
||||||
|
|
||||||
|
size_t len(); |
||||||
|
}; |
||||||
|
|
||||||
|
template<typename T> |
||||||
|
size_t Stack<T>::push(T elem) { |
||||||
|
|
||||||
|
if (this->_data.size() > this->_len) { |
||||||
|
this->_data[this->_len] = elem; |
||||||
|
this->_len++; |
||||||
|
|
||||||
|
return this->_len; |
||||||
|
} |
||||||
|
|
||||||
|
this->_data.push_back(elem); |
||||||
|
this->_len = this->_data.size(); |
||||||
|
|
||||||
|
return this->_len; |
||||||
|
}; |
||||||
|
|
||||||
|
template<typename T> |
||||||
|
Stack<T>::Stack(size_t alloc_size) : _len(0), _data(alloc_size) {}; |
||||||
|
|
||||||
|
template<typename T> |
||||||
|
T Stack<T>::pop() { |
||||||
|
|
||||||
|
if (this->_len == 0) { |
||||||
|
std::abort(); |
||||||
|
} |
||||||
|
|
||||||
|
this->_len--; |
||||||
|
|
||||||
|
return this->_data[this->_len]; |
||||||
|
} |
||||||
|
|
||||||
|
template<typename T> |
||||||
|
size_t Stack<T>::len() { |
||||||
|
return this->_len; |
||||||
|
} |
||||||
|
|
||||||
|
enum class BracketType { |
||||||
|
CURLY = 0, |
||||||
|
SQUARE, |
||||||
|
ROUND, |
||||||
|
MAX, |
||||||
|
}; |
||||||
|
|
||||||
|
enum class BracketDirection { |
||||||
|
OPENING = 0, |
||||||
|
CLOSING, |
||||||
|
MAX, |
||||||
|
}; |
||||||
|
|
||||||
|
typedef std::pair<BracketType, BracketDirection> Bracket_t; |
||||||
|
|
||||||
|
const std::string YES = "YES"; |
||||||
|
const std::string NO = "NO"; |
||||||
|
|
||||||
|
std::string ltrim(const std::string &); |
||||||
|
|
||||||
|
std::string rtrim(const std::string &); |
||||||
|
|
||||||
|
Bracket_t toType(char v) { |
||||||
|
switch (v) { |
||||||
|
case '[': |
||||||
|
return {BracketType::ROUND, BracketDirection::OPENING}; |
||||||
|
case '{': |
||||||
|
return {BracketType::CURLY, BracketDirection::OPENING}; |
||||||
|
case '(': |
||||||
|
return {BracketType::SQUARE, BracketDirection::OPENING}; |
||||||
|
case ']': |
||||||
|
return {BracketType::ROUND, BracketDirection::CLOSING}; |
||||||
|
case '}': |
||||||
|
return {BracketType::CURLY, BracketDirection::CLOSING}; |
||||||
|
case ')': |
||||||
|
return {BracketType::SQUARE, BracketDirection::CLOSING}; |
||||||
|
default: |
||||||
|
return {BracketType::MAX, BracketDirection::MAX}; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* Complete the 'isBalanced' function below. |
||||||
|
* |
||||||
|
* The function is expected to return a std::STRING. |
||||||
|
* The function accepts std::STRING s as parameter. |
||||||
|
*/ |
||||||
|
|
||||||
|
std::string isBalanced(std::string s) { |
||||||
|
|
||||||
|
if (s.empty()) { |
||||||
|
return YES; |
||||||
|
} |
||||||
|
|
||||||
|
Stack<BracketType> brackets; |
||||||
|
|
||||||
|
for (char i: s) { |
||||||
|
Bracket_t b = toType(i); |
||||||
|
|
||||||
|
if (b.second == BracketDirection::OPENING) { |
||||||
|
brackets.push(b.first); |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
if (brackets.len() > 0) { |
||||||
|
auto ctx = brackets.pop(); |
||||||
|
if (ctx == b.first) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return NO; |
||||||
|
} |
||||||
|
|
||||||
|
return brackets.len() > 0 ? NO : YES; |
||||||
|
} |
||||||
|
|
||||||
|
int main() { |
||||||
|
std::ofstream fout(getenv("OUTPUT_PATH")); |
||||||
|
|
||||||
|
std::string t_temp; |
||||||
|
getline(std::cin, t_temp); |
||||||
|
|
||||||
|
int t = stoi(ltrim(rtrim(t_temp))); |
||||||
|
|
||||||
|
for (int t_itr = 0; t_itr < t; t_itr++) { |
||||||
|
std::string s; |
||||||
|
getline(std::cin, s); |
||||||
|
|
||||||
|
std::string result = isBalanced(s); |
||||||
|
|
||||||
|
fout << result << "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
fout.close(); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
std::string ltrim(const std::string &str) { |
||||||
|
std::string s(str); |
||||||
|
|
||||||
|
s.erase( |
||||||
|
s.begin(), |
||||||
|
find_if(s.begin(), s.end(), not1(std::ptr_fun<int, int>(isspace))) |
||||||
|
); |
||||||
|
|
||||||
|
return s; |
||||||
|
} |
||||||
|
|
||||||
|
std::string rtrim(const std::string &str) { |
||||||
|
std::string s(str); |
||||||
|
|
||||||
|
s.erase( |
||||||
|
find_if(s.rbegin(), s.rend(), not1(std::ptr_fun<int, int>(isspace))).base(), |
||||||
|
s.end() |
||||||
|
); |
||||||
|
|
||||||
|
return s; |
||||||
|
} |
Loading…
Reference in new issue