#include <iostream>
template<typename T>
class Stack {
private:
T* arr;
size_t cnt;
size_t size;
public:
Stack(void):arr(NULL), cnt(0), size(16){}
Stack(const Stack& s):arr(NULL), cnt(0), size(16){
this->copy(s);
}
~Stack(){
this->clear();
}
public:
bool push(const T& val){
if(this->resize(1)){
arr[cnt++] = val;
return true;
}
return false;
}
void copy(const Stack& s){
if((this != &s) && !s.isEmpty()){
this->clear();
if(this->resize(s.cnt)){
const T* e = s.arr + s.cnt;
for(const T* p = s.arr; p != e; ++p)
this->push(*p);
}
}
}
void pop(void){
if((cnt > 0) && (--cnt == 0))
this->clear();
}
void clear(void){
if(arr != NULL)
delete[] arr;
arr = NULL;
cnt = 0;
size = 16;
}
T& top(void){ return arr[cnt - 1]; }
T& top(void) const { return arr[cnt - 1]; }
bool isEmpty(void) const {
return (arr == NULL);
}
size_t getSize(void) const {
return cnt;
}
Stack& operator = (const Stack& s){
this->copy(s);
return *this;
}
public:
int resize(size_t N){
if(arr == NULL){
if(N > size)
size = N + 1;
arr = new (std::nothrow) T[size];
if(arr == NULL)
return 0;
} else if((cnt + N) > size){
T* ptr = new (std::nothrow) T[cnt + N + size];
if(ptr == NULL)
return 0;
for(size_t i = 0; i < cnt; ++i)
ptr[i] = arr[i];
delete[] arr;
arr = ptr;
size = cnt + N + size;
}
return 1;
}
};
int main(void) {
Stack<int> s;
for(int i = 0; i < 10; ++i)
s.push(i);
while(! s.isEmpty()){
std::cout << s.top() << ' ';
s.pop();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBTdGFjayB7CnByaXZhdGU6CglUKiAgICAgYXJyOwoJc2l6ZV90IGNudDsKCXNpemVfdCBzaXplOwpwdWJsaWM6CgoJU3RhY2sodm9pZCk6YXJyKE5VTEwpLCBjbnQoMCksIHNpemUoMTYpe30KCVN0YWNrKGNvbnN0IFN0YWNrJiBzKTphcnIoTlVMTCksIGNudCgwKSwgc2l6ZSgxNil7CgkJdGhpcy0+Y29weShzKTsKCX0KCX5TdGFjaygpewoJCXRoaXMtPmNsZWFyKCk7Cgl9CgpwdWJsaWM6CgoJYm9vbCBwdXNoKGNvbnN0IFQmIHZhbCl7CgkJaWYodGhpcy0+cmVzaXplKDEpKXsKCQkJYXJyW2NudCsrXSA9IHZhbDsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgl2b2lkIGNvcHkoY29uc3QgU3RhY2smIHMpewoJCWlmKCh0aGlzICE9ICZzKSAmJiAhcy5pc0VtcHR5KCkpewoJCQl0aGlzLT5jbGVhcigpOwoJCQlpZih0aGlzLT5yZXNpemUocy5jbnQpKXsKCQkJCWNvbnN0IFQqIGUgPSBzLmFyciArIHMuY250OwoJCQkJZm9yKGNvbnN0IFQqIHAgPSBzLmFycjsgcCAhPSBlOyArK3ApCgkJCQkJdGhpcy0+cHVzaCgqcCk7CgkJCX0KCQl9Cgl9CgoJdm9pZCBwb3Aodm9pZCl7CgkJaWYoKGNudCA+IDApICYmICgtLWNudCA9PSAwKSkKCQkJdGhpcy0+Y2xlYXIoKTsKCX0KCgl2b2lkIGNsZWFyKHZvaWQpewoJCWlmKGFyciAhPSBOVUxMKQoJCQlkZWxldGVbXSBhcnI7CgkJYXJyICA9IE5VTEw7CgkJY250ICA9IDA7CgkJc2l6ZSA9IDE2OwoJfQoKCVQmIHRvcCh2b2lkKXsgcmV0dXJuIGFycltjbnQgLSAxXTsgfQoJVCYgdG9wKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGFycltjbnQgLSAxXTsgfQoKCWJvb2wgaXNFbXB0eSh2b2lkKSBjb25zdCB7CgkJcmV0dXJuIChhcnIgPT0gTlVMTCk7Cgl9CgoJc2l6ZV90IGdldFNpemUodm9pZCkgY29uc3QgewoJCXJldHVybiBjbnQ7Cgl9CgoJU3RhY2smIG9wZXJhdG9yID0gKGNvbnN0IFN0YWNrJiBzKXsKCQl0aGlzLT5jb3B5KHMpOwoJCXJldHVybiAqdGhpczsKCX0KCnB1YmxpYzoKCglpbnQgcmVzaXplKHNpemVfdCBOKXsKCQlpZihhcnIgPT0gTlVMTCl7CgkJCWlmKE4gPiBzaXplKQoJCQkJc2l6ZSA9IE4gKyAxOwoJCQlhcnIgPSBuZXcgKHN0ZDo6bm90aHJvdykgVFtzaXplXTsKCQkJaWYoYXJyID09IE5VTEwpCgkJCQlyZXR1cm4gMDsKCQl9IGVsc2UgaWYoKGNudCArIE4pID4gc2l6ZSl7CgkJCVQqIHB0ciA9IG5ldyAoc3RkOjpub3Rocm93KSBUW2NudCArIE4gKyBzaXplXTsKCQkJaWYocHRyID09IE5VTEwpCgkJCQlyZXR1cm4gMDsKCQkJZm9yKHNpemVfdCBpID0gMDsgaSA8IGNudDsgKytpKQoJCQkJcHRyW2ldID0gYXJyW2ldOwoJCQoJCQlkZWxldGVbXSBhcnI7CgkJCWFyciAgPSBwdHI7CgkJCXNpemUgPSBjbnQgKyBOICsgc2l6ZTsKCQl9CgkJcmV0dXJuIDE7Cgl9Cn07CgoKaW50IG1haW4odm9pZCkgewoJU3RhY2s8aW50PiBzOwoJZm9yKGludCBpID0gMDsgaSA8IDEwOyArK2kpCgkJcy5wdXNoKGkpOwoKCXdoaWxlKCEgcy5pc0VtcHR5KCkpewoJCXN0ZDo6Y291dCA8PCBzLnRvcCgpIDw8ICcgJzsKCQlzLnBvcCgpOwoJfQoJcmV0dXJuIDA7Cn0=