summaryrefslogtreecommitdiff
path: root/1_anno/Programmazione_2/data_structures/stack.cc
diff options
context:
space:
mode:
Diffstat (limited to '1_anno/Programmazione_2/data_structures/stack.cc')
-rw-r--r--1_anno/Programmazione_2/data_structures/stack.cc70
1 files changed, 70 insertions, 0 deletions
diff --git a/1_anno/Programmazione_2/data_structures/stack.cc b/1_anno/Programmazione_2/data_structures/stack.cc
new file mode 100644
index 0000000..ffff780
--- /dev/null
+++ b/1_anno/Programmazione_2/data_structures/stack.cc
@@ -0,0 +1,70 @@
+#include<iostream>
+
+using namespace std;
+
+template<typename T>
+struct node {
+ T value;
+ node<T>* next;
+};
+
+template<class T>
+class stack {
+public:
+ stack() : _head{nullptr} {}
+
+ ~stack() {
+ auto iter = _head;
+ while(iter) {
+ delete iter;
+ iter = iter->next;
+ }
+ }
+
+ stack<T>* push(T val) {
+
+ if(!_head) {
+ _head = new node<T>{val, nullptr};
+ } else {
+ _head = new node<T>{val, _head};
+ }
+
+ return this;
+ }
+
+ node<T>* pop() {
+ if(!_head) return nullptr;
+ node<T>* elem = _head;
+ delete _head;
+ _head = elem->next;
+
+ return elem;
+ }
+
+ void print() {
+ auto iter = _head;
+ while(iter) {
+ cout << iter->value << ' ';
+ iter = iter->next;
+ }
+ cout << endl;
+ }
+private:
+ node<T>* _head;
+};
+
+int main() {
+ stack<int>* s = new stack<int>();
+
+ s->pop();
+ s->push(4)->push(2)->push(8);
+ s->print();
+ auto e = s->pop();
+ if(e)
+ cout << e->value << endl;
+ s->push(1);
+ s->print();
+
+ delete s;
+ return 0;
+}