#include <iostream>
// using namespace std ; // unlearn the habbit of doing this.
#include <memory> // for unique_ptr
class Stack
{
// note: class is private by default.
// unique_ptr will automatically free memory for us.
using ptr_t = std::unique_ptr<int[]>;
ptr_t base_;
int* top_;
int* end_;
public :
Stack(int size=100)
: base_(new int[size])
, top_(base_.get())
, end_(top_ + size)
{}
bool empty() const
{ return top_ == base_.get(); }
bool full() const
{ return top_ == end_; }
// don't print errors from a library
bool push(int value)
{
if (full()) // written in terms of our own members
return false;
*(top_++) = value;
return true;
}
bool pop()
{
if (empty()) // written in terms of our own members
return false;
--top_;
return true;
}
const int& read_top() const // const ref so it's not modifiable
{ return *(top_-1); }
int size() const { return end_ - top_; }
int capacity() const { return end_ - base_.get(); }
std::ostream& print(std::ostream& to)
{
to << "Stack is ";
for (int* ptr = base_.get(); ptr != top_; ++ptr)
to << *ptr << ' ';
to << '\n';
return to;
}
// or we could do this:
friend std::ostream& operator << (std::ostream& to, const Stack& s)
{
to << '[';
for (int* ptr = s.base_.get(); ptr != s.top_; ++ptr) {
to << *ptr << ',';
}
return to << ']';
}
};
int main()
{
Stack s(5);
s.push(1);
s.push(2);
s.push(3);
s.print(std::cout);
std::cout << "stack is: " << s << '\n';
}
CSNpbmNsdWRlIDxpb3N0cmVhbT4KCS8vIHVzaW5nIG5hbWVzcGFjZSBzdGQgOyAgLy8gdW5sZWFybiB0aGUgaGFiYml0IG9mIGRvaW5nIHRoaXMuCgkjaW5jbHVkZSA8bWVtb3J5PiAgLy8gZm9yIHVuaXF1ZV9wdHIKCgljbGFzcyBTdGFjawoJewoJCS8vIG5vdGU6IGNsYXNzIGlzIHByaXZhdGUgYnkgZGVmYXVsdC4KCQkJLy8gdW5pcXVlX3B0ciB3aWxsIGF1dG9tYXRpY2FsbHkgZnJlZSBtZW1vcnkgZm9yIHVzLgoJCQl1c2luZyAgcHRyX3QgPSBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+OwoKCSAgICAgICAgcHRyX3QgIGJhc2VfOwoJICAgICAgICBpbnQqICAgdG9wXzsKCSAgICAgICAgaW50KiAgIGVuZF87CgoJICAgIHB1YmxpYyA6CgkgICAgICAgIFN0YWNrKGludCBzaXplPTEwMCkKCSAgICAgICAgICA6IGJhc2VfKG5ldyBpbnRbc2l6ZV0pCgkgICAgICAgICAgLCB0b3BfKGJhc2VfLmdldCgpKQoJICAgICAgICAgICwgZW5kXyh0b3BfICsgc2l6ZSkKCSAgICAgICAge30KCgkgICAgICAgIGJvb2wgZW1wdHkoKSBjb25zdAoJICAgICAgICB7IHJldHVybiB0b3BfID09IGJhc2VfLmdldCgpOyB9CgoJICAgICAgICBib29sIGZ1bGwoKSBjb25zdAoJICAgICAgICB7IHJldHVybiB0b3BfID09IGVuZF87IH0KCgkgICAgICAgIC8vIGRvbid0IHByaW50IGVycm9ycyBmcm9tIGEgbGlicmFyeQoJICAgICAgICBib29sIHB1c2goaW50IHZhbHVlKQoJICAgICAgICB7IAoJICAgICAgICAJaWYgKGZ1bGwoKSkgIC8vIHdyaXR0ZW4gaW4gdGVybXMgb2Ygb3VyIG93biBtZW1iZXJzCgkgICAgICAgIAkJcmV0dXJuIGZhbHNlOwoJICAgICAgICAgICAgKih0b3BfKyspID0gdmFsdWU7CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgCgkgICAgICAgIH0KCgkgICAgICAgIGJvb2wgcG9wKCkKCSAgICAgICAgeyAKCSAgICAgICAgCWlmIChlbXB0eSgpKSAgLy8gd3JpdHRlbiBpbiB0ZXJtcyBvZiBvdXIgb3duIG1lbWJlcnMKCSAgICAgICAgCSAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgICAgICAtLXRvcF87CgkgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCSAgICAgICAgfQoKCSAgICAgICAgY29uc3QgaW50JiByZWFkX3RvcCgpIGNvbnN0ICAvLyBjb25zdCByZWYgc28gaXQncyBub3QgbW9kaWZpYWJsZQoJICAgICAgICB7IHJldHVybiAqKHRvcF8tMSk7IH0KCgkgICAgICAgIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gZW5kXyAtIHRvcF87IH0KICAgICAgICAgICAgaW50IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gZW5kXyAtIGJhc2VfLmdldCgpOyB9CgoJICAgICAgICBzdGQ6Om9zdHJlYW0mIHByaW50KHN0ZDo6b3N0cmVhbSYgdG8pCgkgICAgICAgIHsKCSAgICAgICAgCXRvIDw8ICJTdGFjayBpcyAiOwoJICAgICAgICAJZm9yIChpbnQqIHB0ciA9IGJhc2VfLmdldCgpOyBwdHIgIT0gdG9wXzsgKytwdHIpCgkgICAgICAgIAkJdG8gPDwgKnB0ciA8PCAnICc7CgkgICAgICAgIAl0byA8PCAnXG4nOwoJICAgICAgICAJcmV0dXJuIHRvOwoJICAgICAgICB9CgkgICAgICAgIAoJICAgICAgICAvLyBvciB3ZSBjb3VsZCBkbyB0aGlzOgoJICAgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJiB0bywgY29uc3QgU3RhY2smIHMpCgkgICAgICAgIHsKCSAgICAgICAgCXRvIDw8ICdbJzsKCSAgICAgICAgCWZvciAoaW50KiBwdHIgPSBzLmJhc2VfLmdldCgpOyBwdHIgIT0gcy50b3BfOyArK3B0cikgewoJICAgICAgICAJCXRvIDw8ICpwdHIgPDwgJywnOwoJICAgICAgICAJfQoJICAgICAgICAJcmV0dXJuIHRvIDw8ICddJzsKCSAgICAgICAgfQoJfTsKCglpbnQgbWFpbigpCgl7CgkJU3RhY2sgcyg1KTsKCQlzLnB1c2goMSk7CgkJcy5wdXNoKDIpOwoJCXMucHVzaCgzKTsKCQlzLnByaW50KHN0ZDo6Y291dCk7CgkJc3RkOjpjb3V0IDw8ICJzdGFjayBpczogIiA8PCBzIDw8ICdcbic7Cgl9