#include <stdio.h>
#include <stdexcept>
using namespace std;
 
struct IStack {
    virtual void push(int value) = 0; //добавить элемент value в стек,                      O(1)
    virtual void pop() = 0;           //удалить из стека последний добавленный элемент,     O(1)
    virtual int &top() = 0;           //получить значение последнего добавленного элемента, O(1)
    virtual int size() const = 0;     //получить количество элементов в стеке,              O(1)
    virtual bool empty() const = 0;   //проверить, пуст ли стек,                            O(1)
};
 
class ArrayStack : public IStack {
	static const int MAX_SIZE = 100;
	int a[MAX_SIZE], topIndex, elementsCount;
public:
	ArrayStack() {
		topIndex = elementsCount = 0;
	}
	void push(int value) {
		if (elementsCount == MAX_SIZE)
			throw runtime_error("Stack is full!");
		a[topIndex++] = value;
		elementsCount++;
	}
	void pop() {
		if (empty())
			throw runtime_error("Stack is empty!");
		topIndex--;
		elementsCount--;
	}
	int &top() {
		if (empty())
			throw runtime_error("Stack is empty!");
		return a[topIndex - 1];
	}
	int size() const {
		return elementsCount;
	}
	bool empty() const {
		return elementsCount == 0;
	}
};
 
 
int main() {
	ArrayStack stack;
	for (int i = 1; i <= 5; i++) {
		stack.push(i);
	}
	for (int i = 1; i <= 5; i++) {
		printf("%d ", stack.top());
		stack.pop();
	}	
}
				I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRleGNlcHQ+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgSVN0YWNrIHsKICAgIHZpcnR1YWwgdm9pZCBwdXNoKGludCB2YWx1ZSkgPSAwOyAvL9C00L7QsdCw0LLQuNGC0Ywg0Y3Qu9C10LzQtdC90YIgdmFsdWUg0LIg0YHRgtC10LosICAgICAgICAgICAgICAgICAgICAgIE8oMSkKICAgIHZpcnR1YWwgdm9pZCBwb3AoKSA9IDA7ICAgICAgICAgICAvL9GD0LTQsNC70LjRgtGMINC40Lcg0YHRgtC10LrQsCDQv9C+0YHQu9C10LTQvdC40Lkg0LTQvtCx0LDQstC70LXQvdC90YvQuSDRjdC70LXQvNC10L3RgiwgICAgIE8oMSkKICAgIHZpcnR1YWwgaW50ICZ0b3AoKSA9IDA7ICAgICAgICAgICAvL9C/0L7Qu9GD0YfQuNGC0Ywg0LfQvdCw0YfQtdC90LjQtSDQv9C+0YHQu9C10LTQvdC10LPQviDQtNC+0LHQsNCy0LvQtdC90L3QvtCz0L4g0Y3Qu9C10LzQtdC90YLQsCwgTygxKQogICAgdmlydHVhbCBpbnQgc2l6ZSgpIGNvbnN0ID0gMDsgICAgIC8v0L/QvtC70YPRh9C40YLRjCDQutC+0LvQuNGH0LXRgdGC0LLQviDRjdC70LXQvNC10L3RgtC+0LIg0LIg0YHRgtC10LrQtSwgICAgICAgICAgICAgIE8oMSkKICAgIHZpcnR1YWwgYm9vbCBlbXB0eSgpIGNvbnN0ID0gMDsgICAvL9C/0YDQvtCy0LXRgNC40YLRjCwg0L/Rg9GB0YIg0LvQuCDRgdGC0LXQuiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgTygxKQp9OwoKY2xhc3MgQXJyYXlTdGFjayA6IHB1YmxpYyBJU3RhY2sgewoJc3RhdGljIGNvbnN0IGludCBNQVhfU0laRSA9IDEwMDsKCWludCBhW01BWF9TSVpFXSwgdG9wSW5kZXgsIGVsZW1lbnRzQ291bnQ7CnB1YmxpYzoKCUFycmF5U3RhY2soKSB7CgkJdG9wSW5kZXggPSBlbGVtZW50c0NvdW50ID0gMDsKCX0KCXZvaWQgcHVzaChpbnQgdmFsdWUpIHsKCQlpZiAoZWxlbWVudHNDb3VudCA9PSBNQVhfU0laRSkKCQkJdGhyb3cgcnVudGltZV9lcnJvcigiU3RhY2sgaXMgZnVsbCEiKTsKCQlhW3RvcEluZGV4KytdID0gdmFsdWU7CgkJZWxlbWVudHNDb3VudCsrOwoJfQoJdm9pZCBwb3AoKSB7CgkJaWYgKGVtcHR5KCkpCgkJCXRocm93IHJ1bnRpbWVfZXJyb3IoIlN0YWNrIGlzIGVtcHR5ISIpOwoJCXRvcEluZGV4LS07CgkJZWxlbWVudHNDb3VudC0tOwoJfQoJaW50ICZ0b3AoKSB7CgkJaWYgKGVtcHR5KCkpCgkJCXRocm93IHJ1bnRpbWVfZXJyb3IoIlN0YWNrIGlzIGVtcHR5ISIpOwoJCXJldHVybiBhW3RvcEluZGV4IC0gMV07Cgl9CglpbnQgc2l6ZSgpIGNvbnN0IHsKCQlyZXR1cm4gZWxlbWVudHNDb3VudDsKCX0KCWJvb2wgZW1wdHkoKSBjb25zdCB7CgkJcmV0dXJuIGVsZW1lbnRzQ291bnQgPT0gMDsKCX0KfTsKCgppbnQgbWFpbigpIHsKCUFycmF5U3RhY2sgc3RhY2s7Cglmb3IgKGludCBpID0gMTsgaSA8PSA1OyBpKyspIHsKCQlzdGFjay5wdXNoKGkpOwoJfQoJZm9yIChpbnQgaSA9IDE7IGkgPD0gNTsgaSsrKSB7CgkJcHJpbnRmKCIlZCAiLCBzdGFjay50b3AoKSk7CgkJc3RhY2sucG9wKCk7Cgl9CQp9