IT++ Logo
stack.h
Go to the documentation of this file.
1
35#ifndef STACK_H
36#define STACK_H
37
38#include <itpp/base/itassert.h>
39
40
41namespace itpp
42{
43
65template<class T>
66class Stack
67{
68public:
70 Stack();
72 Stack(int n);
74 Stack(const Stack<T> &s);
76 virtual ~Stack();
77
79 T pop();
81 T peek() const;
83 void push(T v);
85 void clear();
86
88 void operator=(const Stack<T> &s);
89
91 int size() const { return ndata; }
93 int no_elements() const { return valptr; }
95 void set_size(int n, bool copy = false);
96
97private:
98 int valptr;
99 int ndata;
100 T *data;
101
102private:
103 void alloc(int n);
104 void free();
105};
106
107// --------------------------- Implementation starts here ----------------------------------
108
109template<class T>
111{
112 data = 0;
113 ndata = 0;
114 valptr = 0;
115}
116
117template<class T>
119{
120 alloc(n);
121 valptr = 0;
122}
123
124template<class T>
126{
127 data = NULL;
128 ndata = 0;
129 valptr = s.valptr;
130 alloc(s.ndata);
131 for (int i = 0; i < s.ndata; i++)
132 data[i] = s.data[i];
133}
134
135template<class T>
137{
138 free();
139}
140
141template <class T>
143{
144 it_error_if(valptr == 0, "Stack<T>::pop: Empty stack");
145 valptr--;
146 return data[valptr];
147}
148
149template <class T>
151{
152 it_error_if(valptr == 0, "Stack<T>::peek: Empty stack");
153 return data[valptr-1];
154}
155
156template <class T>
158{
159 it_error_if(valptr >= ndata, "Stack<T>::push: Full stack");
160 data[valptr] = v;
161 valptr++;
162}
163
164template <class T>
166{
167 valptr = 0;
168}
169
170template<class T>
171void Stack<T>::alloc(int n)
172{
173 if (n == 0) {
174 data = NULL;
175 ndata = 0;
176 }
177 else {
178 data = new T[n];
179 it_assert_debug(data != 0, "Out of memory in Stack::alloc");
180 }
181 ndata = n;
182}
183
184template<class T>
185void Stack<T>::free()
186{
187
188 delete [] data;
189
190 data = 0;
191 ndata = 0;
192}
193
194template<class T>
196{
197 set_size(s.ndata);
198 for (int i = 0; i < ndata; i++)
199 data[i] = s.data[i];
200 valptr = 0;
201}
202
203template<class T>
204void Stack<T>::set_size(int sz, bool copy)
205{
206 int i, min;
207 T *tmp;
208
209 if (ndata == sz)
210 return;
211
212 if (copy) {
213 tmp = data;
214 min = ndata < sz ? ndata : sz;
215 alloc(sz);
216 for (i = 0; i < min; i++)
217 data[i] = tmp[i];
218 delete [] tmp;
219 }
220 else {
221 free();
222 alloc(sz);
223 }
224 ndata = sz;
225}
226
227} // namespace itpp
228
229#endif // #ifndef STACK_H
General stack class.
Definition stack.h:67
virtual ~Stack()
Default destructor.
Definition stack.h:136
int size() const
Returns the maximum number of data elements the stack can store.
Definition stack.h:91
Stack()
Default constructor.
Definition stack.h:110
void set_size(int n, bool copy=false)
Resizing a Stack<T>.
Definition stack.h:204
void push(T v)
Push an element at top of stack.
Definition stack.h:157
T peek() const
Peek at the topmost element of the stack, without removing it.
Definition stack.h:150
void operator=(const Stack< T > &s)
Assignment operator.
Definition stack.h:195
int no_elements() const
Returns the number of data elements currently in the stack.
Definition stack.h:93
T pop()
Pop the topmost element of the stack.
Definition stack.h:142
void clear()
Empty the stack.
Definition stack.h:165
#define it_error_if(t, s)
Abort if t is true.
Definition itassert.h:117
#define it_assert_debug(t, s)
Abort if t is not true and NDEBUG is not defined.
Definition itassert.h:107
T min(const Vec< T > &in)
Minimum value of vector.
Definition min_max.h:125
Error handling functions - header file.
itpp namespace
Definition itmex.h:37
SourceForge Logo

Generated on Mon Apr 7 2025 07:53:18 for IT++ by Doxygen 1.11.0