-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstack.cpp
More file actions
113 lines (106 loc) · 2.68 KB
/
stack.cpp
File metadata and controls
113 lines (106 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include<iostream>
#include "linked_list.h"
#include "stack.h"
// Constructors
template<class T>
Stack<T>::Stack(): capacity{10}, size{0}{
this->stack = new T[10];
top = stack;
}
template<class T>
Stack<T>::Stack(int capacity) : capacity{capacity > 0 ? static_cast<size_t>(capacity) : 10}, size{0}{
this->stack = new T[this->capacity];
top = stack;
}
template <class T>
Stack<T>::Stack(int size, T arr[]) : capacity{size > 0 ? static_cast<size_t>(size) : 10}, size{size > 0 ? static_cast<size_t>(size) : 0}{
stack = new T[capacity];
for (int i = 0; i < size; i++){
stack[i] = arr[i];
}
top = stack + this->size - 1;
}
template<class T>
Stack<T>::Stack(int capacity, const LinkedList<T>& ll) : capacity{capacity > 0 ? static_cast<size_t>(capacity) : 10}, size{static_cast<size_t>(ll.size())}{
stack = new T[capacity];
for (int i = 0; i < ll.size(); i++){
stack[i] = ll.at(i);
}
top = stack + this->size - 1;
}
template<class T>
Stack<T>::Stack(const Stack<T> &stack){
size = stack.size;
capacity = stack.capacity;
this->stack = new T[capacity];
for (int i = 0; i < size; i++)
{
this->stack[i] = stack.stack[i];
}
top = this->stack + this->size - 1;
}
// Accessors
template<class T>
T Stack<T>::peek() const{
return *top;
}
template<class T>
int Stack<T>::getSize() const{
return size;
}
template<class T>
int Stack<T>::getCapacity() const{
return capacity;
}
// Enquiry Functions
template<class T>
bool Stack<T>::isEmpty() const{
return size == 0;
}
// Mutators
template<class T>
T Stack<T>::pop(){
if(size == 0) {
throw std::runtime_error(std::string("Stack already empty"));
}
T ele = stack[size - 1];
stack[size - 1] = static_cast<T>(0);
size--;
top = stack + size - 1;
return ele;
}
template<class T>
void Stack<T>::push(T ele){
if(size == capacity){
T *temp = new T[size * 2];
for (int i = 0; i < size; i++){
temp[i] = stack[i];
}
delete[] stack;
stack = temp;
capacity *= 2;
}
stack[size] = ele;
size++;
top = stack + size - 1;
}
// Facilitators
template<class T>
void Stack<T>::display() const{
for (int i = size-1; i >= 0; i--){
std::cout << stack[i] << std::endl;
}
}
// Operator Overloads
template<class T>
std::ostream &operator<<(std::ostream& cout, const Stack<T>& stack){
for (int i = stack.size - 1; i >= 0; i--){
cout << stack.stack[i] << std::endl;
}
return cout;
}
// Destructors
template<class T>
Stack<T>::~Stack(){
delete[] stack;
}