#include <iostream>
#include <cassert>
#include <cstring>
template<typename T>
class stack {
public:
stack(const size_t size = s_incrementSize) : m_index(-1) {
assert(size > 0);
m_memory = new T[size];
m_size = size;
}
~stack() {
for (size_t idx = 0; idx < m_index; ++idx) {
m_memory[idx].~T();
}
}
void push(const T &data) {
if (++m_index >= m_size) {
size_t newSize = m_size + s_incrementSize;
T *newMemory = new T[newSize];
memcpy(newMemory, m_memory, sizeof(T) * m_index);
delete[] m_memory;
m_memory = newMemory;
m_size = newSize;
}
new (m_memory + m_index) T(data);
}
T pop() {
if (m_index >= 0) {
T result = m_memory[m_index];
m_memory[m_index--].~T();
return result;
} else {
return T();
}
}
size_t size() const { return m_index + 1; }
T &operator[](const size_t index) const {
assert(index >= 0);
assert(index <= m_index);
return m_memory[index];
}
private:
static constexpr size_t s_incrementSize = 1000;
size_t m_index;
size_t m_size;
T *m_memory;
};
int main(int argc, char **argv) {
stack<int> s;
s.push(10);
s.push(20);
s.push(30);
while (s.size() > 0) {
std::cout << " " << s.pop();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPGNzdHJpbmc+CgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3Mgc3RhY2sgewpwdWJsaWM6CglzdGFjayhjb25zdCBzaXplX3Qgc2l6ZSA9IHNfaW5jcmVtZW50U2l6ZSkgOiBtX2luZGV4KC0xKSB7CgkJYXNzZXJ0KHNpemUgPiAwKTsKCQltX21lbW9yeSA9IG5ldyBUW3NpemVdOwoJCW1fc2l6ZSA9IHNpemU7Cgl9CgkKCX5zdGFjaygpIHsKCQlmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBtX2luZGV4OyArK2lkeCkgewoJCQltX21lbW9yeVtpZHhdLn5UKCk7CgkJfQoJfQoJCgl2b2lkIHB1c2goY29uc3QgVCAmZGF0YSkgewoJCWlmICgrK21faW5kZXggPj0gbV9zaXplKSB7CgkJCXNpemVfdCBuZXdTaXplID0gbV9zaXplICsgc19pbmNyZW1lbnRTaXplOwoJCQlUICpuZXdNZW1vcnkgPSBuZXcgVFtuZXdTaXplXTsKCQkJbWVtY3B5KG5ld01lbW9yeSwgbV9tZW1vcnksIHNpemVvZihUKSAqIG1faW5kZXgpOwoJCQlkZWxldGVbXSBtX21lbW9yeTsKCQkJbV9tZW1vcnkgPSBuZXdNZW1vcnk7CgkJCW1fc2l6ZSA9IG5ld1NpemU7CgkJfQoJCQoJCW5ldyAobV9tZW1vcnkgKyBtX2luZGV4KSBUKGRhdGEpOwoJfQoJCglUIHBvcCgpIHsKCQlpZiAobV9pbmRleCA+PSAwKSB7CgkJCVQgcmVzdWx0ID0gbV9tZW1vcnlbbV9pbmRleF07CgkJCW1fbWVtb3J5W21faW5kZXgtLV0uflQoKTsKCQkJcmV0dXJuIHJlc3VsdDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gVCgpOwoJCX0KCX0KCQoJc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX2luZGV4ICsgMTsgfQoJCglUICZvcGVyYXRvcltdKGNvbnN0IHNpemVfdCBpbmRleCkgY29uc3QgewoJCWFzc2VydChpbmRleCA+PSAwKTsKCQlhc3NlcnQoaW5kZXggPD0gbV9pbmRleCk7CgkJCgkJcmV0dXJuIG1fbWVtb3J5W2luZGV4XTsKCX0KCQpwcml2YXRlOgoJc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qgc19pbmNyZW1lbnRTaXplID0gMTAwMDsKCglzaXplX3QgbV9pbmRleDsKCXNpemVfdCBtX3NpemU7CglUICptX21lbW9yeTsKfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewoJc3RhY2s8aW50PiBzOwoJCglzLnB1c2goMTApOwoJcy5wdXNoKDIwKTsKCXMucHVzaCgzMCk7CgkKCXdoaWxlIChzLnNpemUoKSA+IDApIHsKCQlzdGQ6OmNvdXQgPDwgIiAiIDw8IHMucG9wKCk7Cgl9CgkKCXJldHVybiAwOwp9