//
// a toy calculator in reverse Polish notation
// similar to dc in Unix
// this illustrates the stack pointer idioms
// *sp++ and so on
// Hayo Thielecke 12.1.2014
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
template<typename T>
class stackArray {
public:
const int stacksize = 100;
T stack[100];
T *sp;
// invariant: sp points to first free element
stackArray<T>() {
sp = stack; // Here we go.
};
~stackArray<T>() {
//delete [] stack;
// free(stack);
sp = NULL;
};
void push(T n)
{
if (sp < stack + stacksize - 1) {
*sp++ = n;
} else {
fprintf(stderr, "Stack overflow!\n\n");
exit(1);
}
}
T pop()
{
if (sp > stack) {
return *--sp;
} else {
fprintf(stderr, "Stack underflow!\n\n");
exit(1);
}
}
int isempty() {
if (sp <= stack) {
return 1;
}
return 0;
}
void printstack()
{
int *p = sp - 1;
printf("\nStack is: ");
while (p >= stack)
printf("%6d", *p--);
printf("\n\n");
}
void applytoall(void (*func) (T&))
{
T *p = sp - 1;
while (p >= stack)
func(*p--);
printf("\n");
}
};
void plusone(int &p)
{
p = p + 1;
}
int main() {
stackArray<int> g;
g.push(1);
g.push(2);
g.push(3);
int empty = g.isempty();
std::cout << "HEY" << empty << "\n";
g.printstack();
g.pop();
g.printstack();
g.applytoall(plusone);
g.printstack();
}
Ly8KLy8gYSB0b3kgY2FsY3VsYXRvciBpbiByZXZlcnNlIFBvbGlzaCBub3RhdGlvbgovLyBzaW1pbGFyIHRvIGRjIGluIFVuaXgKLy8gdGhpcyBpbGx1c3RyYXRlcyB0aGUgc3RhY2sgcG9pbnRlciBpZGlvbXMKLy8gKnNwKysgYW5kIHNvIG9uCi8vIEhheW8gVGhpZWxlY2tlIDEyLjEuMjAxNAoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBzdGFja0FycmF5IHsKcHVibGljOgoKCWNvbnN0IGludCBzdGFja3NpemUgPSAxMDA7CgoJVCBzdGFja1sxMDBdOwoJVCAqc3A7CgoJLy8gaW52YXJpYW50OiBzcCBwb2ludHMgdG8gZmlyc3QgZnJlZSBlbGVtZW50CgoJc3RhY2tBcnJheTxUPigpIHsKCSAgc3AgPSBzdGFjazsgLy8gSGVyZSB3ZSBnby4KCX07CgoJfnN0YWNrQXJyYXk8VD4oKSB7CgkgIC8vZGVsZXRlIFtdIHN0YWNrOwkKCSAvLyBmcmVlKHN0YWNrKTsKCSAgICBzcCA9IE5VTEw7Cgl9OwoKCgl2b2lkIHB1c2goVCBuKQoJewoJICAgIGlmIChzcCA8IHN0YWNrICsgc3RhY2tzaXplIC0gMSkgewoJCSpzcCsrID0gbjsKCSAgICB9IGVsc2UgewoJCWZwcmludGYoc3RkZXJyLCAiU3RhY2sgb3ZlcmZsb3chXG5cbiIpOwoJCWV4aXQoMSk7CgkgICAgfQoJfQoKCVQgcG9wKCkKCXsKCSAgICBpZiAoc3AgPiBzdGFjaykgewoJCXJldHVybiAqLS1zcDsKCSAgICB9IGVsc2UgewoJCWZwcmludGYoc3RkZXJyLCAiU3RhY2sgdW5kZXJmbG93IVxuXG4iKTsKCQlleGl0KDEpOwoJICAgIH0KCX0KCQoJaW50IGlzZW1wdHkoKSB7CgkgICAgaWYgKHNwIDw9IHN0YWNrKSB7CgkJcmV0dXJuIDE7CgkgICAgfQoJICAgIHJldHVybiAwOwoJfQoKCXZvaWQgcHJpbnRzdGFjaygpCgl7CiAgICAJCWludCAqcCA9IHNwIC0gMTsKICAgIAkJcHJpbnRmKCJcblN0YWNrIGlzOiAiKTsKICAgCQl3aGlsZSAocCA+PSBzdGFjaykKICAgICAgICAJcHJpbnRmKCIlNmQiLCAqcC0tKTsKICAgIAkJcHJpbnRmKCJcblxuIik7Cgl9CgkKCXZvaWQgYXBwbHl0b2FsbCh2b2lkICgqZnVuYykgKFQmKSkKCXsKICAgCQkgVCAqcCA9IHNwIC0gMTsKICAgCQkgd2hpbGUgKHAgPj0gc3RhY2spCiAgIAkJICAgIGZ1bmMoKnAtLSk7CiAgIAkJIHByaW50ZigiXG4iKTsKCX0KCgkKCn07CgoKdm9pZCBwbHVzb25lKGludCAmcCkKCXsKCQlwID0gcCArIDE7Cgl9CgppbnQgbWFpbigpIHsKCXN0YWNrQXJyYXk8aW50PiBnOwoJZy5wdXNoKDEpOwoJZy5wdXNoKDIpOwoJZy5wdXNoKDMpOwoJaW50IGVtcHR5ID0gZy5pc2VtcHR5KCk7CglzdGQ6OmNvdXQgPDwgIkhFWSIgPDwgZW1wdHkgPDwgICJcbiI7CglnLnByaW50c3RhY2soKTsKCWcucG9wKCk7CglnLnByaW50c3RhY2soKTsKCWcuYXBwbHl0b2FsbChwbHVzb25lKTsKCWcucHJpbnRzdGFjaygpOwp9CgoK