#include <iostream>
template<typename T, std::size_t Size = 64>
class stack {
T data[Size];
std::size_t elements_count = 0;
public:
template<typename... Ty>
stack(Ty... tys):
data{tys...},
elements_count{sizeof...(Ty)} {}
stack() {}
bool empty() const {
return elements_count == 0;
}
bool full() const {
return elements_count == Size;
}
T pop() {
if(empty()) {
throw std::out_of_range("Cannot pop from empty stack");
}
return data[--elements_count];
}
void push(T const &value) {
if(full()) {
throw std::out_of_range("Cannot push to full stack");
}
data[elements_count++] = value;
}
auto begin() const {
return std::begin(data);
}
auto end() const {
return std::begin(data)+elements_count;
}
};
int main() {
stack<int, 3> s {1, 2, 3};
s.pop();
s.push(4);
for(auto element: s) {
std::cout << element << " ";
}
try {
s.push(100);
}catch(...) {
std::cout << "\npushing to full stack is forbidden";
}
s.pop(); s.pop(); s.pop();
try {
s.pop();
}catch(...) {
std::cout << "\npopping from empty stack is forbidden";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgU2l6ZSA9IDY0PgpjbGFzcyBzdGFjayB7CglUIGRhdGFbU2l6ZV07CglzdGQ6OnNpemVfdCBlbGVtZW50c19jb3VudCA9IDA7CnB1YmxpYzoKCXRlbXBsYXRlPHR5cGVuYW1lLi4uIFR5PgoJc3RhY2soVHkuLi4gdHlzKTogCgkJZGF0YXt0eXMuLi59LCAKCQllbGVtZW50c19jb3VudHtzaXplb2YuLi4oVHkpfSB7fQoJCQoJc3RhY2soKSB7fQoJCglib29sIGVtcHR5KCkgY29uc3QgewoJCXJldHVybiBlbGVtZW50c19jb3VudCA9PSAwOwoJfQoJCglib29sIGZ1bGwoKSBjb25zdCB7CgkJcmV0dXJuIGVsZW1lbnRzX2NvdW50ID09IFNpemU7Cgl9CgkKCVQgcG9wKCkgewoJCWlmKGVtcHR5KCkpIHsKCQkJdGhyb3cgc3RkOjpvdXRfb2ZfcmFuZ2UoIkNhbm5vdCBwb3AgZnJvbSBlbXB0eSBzdGFjayIpOwoJCX0KCQlyZXR1cm4gZGF0YVstLWVsZW1lbnRzX2NvdW50XTsKCX0KCQoJdm9pZCBwdXNoKFQgY29uc3QgJnZhbHVlKSB7CgkJaWYoZnVsbCgpKSB7CgkJCXRocm93IHN0ZDo6b3V0X29mX3JhbmdlKCJDYW5ub3QgcHVzaCB0byBmdWxsIHN0YWNrIik7CgkJfQoJCWRhdGFbZWxlbWVudHNfY291bnQrK10gPSB2YWx1ZTsKCX0KCQoJYXV0byBiZWdpbigpIGNvbnN0IHsKCQlyZXR1cm4gc3RkOjpiZWdpbihkYXRhKTsKCX0KCQoJYXV0byBlbmQoKSBjb25zdCB7CgkJcmV0dXJuIHN0ZDo6YmVnaW4oZGF0YSkrZWxlbWVudHNfY291bnQ7Cgl9Cn07CgppbnQgbWFpbigpIHsKCXN0YWNrPGludCwgMz4gcyB7MSwgMiwgM307CglzLnBvcCgpOwoJcy5wdXNoKDQpOwoJCglmb3IoYXV0byBlbGVtZW50OiBzKSB7CgkJc3RkOjpjb3V0IDw8IGVsZW1lbnQgPDwgIiAiOwoJfQoJCgl0cnkgewoJCXMucHVzaCgxMDApOwoJfWNhdGNoKC4uLikgewoJCXN0ZDo6Y291dCA8PCAiXG5wdXNoaW5nIHRvIGZ1bGwgc3RhY2sgaXMgZm9yYmlkZGVuIjsKCX0KCQoJcy5wb3AoKTsgcy5wb3AoKTsgcy5wb3AoKTsKCQoJdHJ5IHsKCQlzLnBvcCgpOwoJfWNhdGNoKC4uLikgewoJCXN0ZDo6Y291dCA8PCAiXG5wb3BwaW5nIGZyb20gZW1wdHkgc3RhY2sgaXMgZm9yYmlkZGVuIjsKCX0KCXJldHVybiAwOwp9