Skip to content

Commit 7574b69

Browse files
committed
upload implementation of Stack
1 parent 927def6 commit 7574b69

File tree

4 files changed

+181
-0
lines changed

4 files changed

+181
-0
lines changed

Stack/main.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include <iostream>
2+
#include "stack.h"
3+
4+
using namespace std;
5+
6+
int main()
7+
{
8+
Stack<int> stack;
9+
10+
for(int i = 0; i < 1000; i++)
11+
{
12+
stack.Push(i);
13+
}
14+
15+
while(!stack.Empty())
16+
{
17+
std::cout << stack.Top() << std::endl;
18+
stack.Pop();
19+
}
20+
21+
return 0;
22+
}

Stack/stack.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#ifndef STACK_H
2+
#define STACK_H
3+
4+
#include "stack_impl.h"
5+
#include "stack_impl.cpp"
6+
7+
#endif // STACK_H

Stack/stack_impl.cpp

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
#include <iostream>
2+
#include "stack_impl.h"
3+
4+
#define EMPTY_INDEX -1
5+
#define BUF_MINIMUM_CAPACITY 2
6+
7+
template<class T>
8+
Stack<T>::Stack()
9+
:
10+
buf_(nullptr),
11+
buf_size_(0),
12+
buf_maximum_capacity_(0),
13+
buf_minimum_capacity_(0),
14+
top_(EMPTY_INDEX)
15+
{
16+
}
17+
18+
template<class T>
19+
Stack<T>::~Stack()
20+
{
21+
Clear();
22+
}
23+
24+
template<class T>
25+
void Stack<T>::Pop()
26+
{
27+
if (!Empty()) {
28+
top_ -= 1;
29+
buf_size_ -= 1;
30+
CheckBufMinimumCapacity();
31+
}
32+
}
33+
34+
template<class T>
35+
void Stack<T>::Push(T data)
36+
{
37+
if (Empty())
38+
Init();
39+
40+
top_ += 1;
41+
buf_size_ += 1;
42+
43+
buf_[top_] = data;
44+
45+
CheckBufMaximumCapacity();
46+
}
47+
48+
template<class T>
49+
T Stack<T>::Top()
50+
{
51+
return buf_[top_];
52+
}
53+
54+
template<class T>
55+
void Stack<T>::CheckBufMaximumCapacity()
56+
{
57+
if (buf_size_ == buf_maximum_capacity_) {
58+
buf_minimum_capacity_ = buf_maximum_capacity_ / kStackBufCapacityRatio;
59+
buf_maximum_capacity_ = buf_maximum_capacity_ * kStackBufCapacityRatio;
60+
ReallocateBuf(buf_maximum_capacity_);
61+
}
62+
}
63+
64+
template<class T>
65+
void Stack<T>::CheckBufMinimumCapacity()
66+
{
67+
if (buf_size_ > BUF_MINIMUM_CAPACITY &&
68+
buf_size_ == buf_minimum_capacity_) {
69+
70+
ReallocateBuf(buf_minimum_capacity_);
71+
buf_maximum_capacity_ = buf_maximum_capacity_ / kStackBufCapacityRatio;
72+
buf_minimum_capacity_ = buf_minimum_capacity_ / kStackBufCapacityRatio;
73+
}
74+
}
75+
76+
template<class T>
77+
void Stack<T>::ReallocateBuf(int size)
78+
{
79+
T* new_buf = new T[size];
80+
81+
std::copy(buf_, buf_ + buf_size_, new_buf);
82+
delete [] buf_;
83+
84+
buf_ = new_buf;
85+
}
86+
87+
template<class T>
88+
bool Stack<T>::Empty()
89+
{
90+
return (top_ == EMPTY_INDEX);
91+
}
92+
93+
template<class T>
94+
void Stack<T>::Init()
95+
{
96+
if (buf_ != nullptr)
97+
delete [] buf_;
98+
99+
top_ = EMPTY_INDEX;
100+
buf_size_ = 0;
101+
buf_maximum_capacity_ = BUF_MINIMUM_CAPACITY;
102+
buf_minimum_capacity_ = BUF_MINIMUM_CAPACITY;
103+
buf_ = new T[buf_maximum_capacity_];
104+
}
105+
106+
template<class T>
107+
void Stack<T>::Clear()
108+
{
109+
if (buf_ != nullptr)
110+
{
111+
delete[] buf_;
112+
buf_ = nullptr;
113+
}
114+
top_ = EMPTY_INDEX;
115+
}

Stack/stack_impl.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#ifndef STACK_IMPL_H
2+
#define STACK_IMPL_H
3+
4+
const int kStackBufCapacityRatio = 2;
5+
6+
template<class T>
7+
class Stack
8+
{
9+
10+
public:
11+
Stack();
12+
~Stack();
13+
14+
void Pop();
15+
void Push(T data);
16+
T Top();
17+
18+
bool Empty();
19+
20+
private:
21+
void Init();
22+
void Clear();
23+
24+
void CheckBufMaximumCapacity();
25+
void CheckBufMinimumCapacity();
26+
27+
void ReallocateBuf(int size);
28+
29+
T* buf_;
30+
int buf_size_;
31+
int buf_maximum_capacity_;
32+
int buf_minimum_capacity_;
33+
34+
int top_;
35+
};
36+
37+
#endif // STACK__H

0 commit comments

Comments
 (0)