Skip to content

Commit 00de579

Browse files
committed
Add stack cpp
1 parent 0548fcb commit 00de579

File tree

4 files changed

+148
-11
lines changed

4 files changed

+148
-11
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
.sconsign.dblite
2+
13
# Object files
24
*.o
35

stack/SConstruct

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
env = Environment(CCFLAGS='-g')
22

3-
env.Program('stack.c')
3+
env.Program('cstack.c')
4+
env.Program('stack.cpp')

stack/stack.c renamed to stack/cstack.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,10 @@ static void m_travel()
116116

117117
while (tmp)
118118
{
119-
printf("DEBUG: %d\n", tmp->data);
119+
printf("%d\t", tmp->data);
120120
tmp = tmp->next;
121121
}
122+
printf("\n");
122123
}
123124

124125
static void m_cleanup()
@@ -159,19 +160,19 @@ int main(int argc, char *argv[])
159160
{
160161
stack->push(i);
161162
}
162-
printf("DEBUG: top %d ......\n", stack->top()->data);
163-
printf("DEBUG: top %d ......\n", stack->top()->data);
164-
printf("DEBUG: top %d ......\n", stack->top()->data);
165-
printf("DEBUG: size %d ......\n", stack->size());
166-
printf("DEBUG: travel ......\n");
163+
printf("DEBUG: top %d\n", stack->top()->data);
164+
printf("DEBUG: top %d\n", stack->top()->data);
165+
printf("DEBUG: top %d\n", stack->top()->data);
166+
printf("DEBUG: size %d\n", stack->size());
167+
printf("DEBUG: travel\n");
167168
stack->travel();
168-
printf("DEBUG: pop ......\n");
169+
printf("DEBUG: pop\n");
169170
stack->pop();
170-
printf("DEBUG: travel ......\n");
171+
printf("DEBUG: travel\n");
171172
stack->travel();
172-
printf("DEBUG: push 66 ......\n");
173+
printf("DEBUG: push 66\n");
173174
stack->push(66);
174-
printf("DEBUG: travel ......\n");
175+
printf("DEBUG: travel\n");
175176
stack->travel();
176177
stack_cleanup(stack);
177178

stack/stack.cpp

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
#include <iostream>
2+
3+
template<typename T>
4+
class stack_element
5+
{
6+
public:
7+
stack_element() :next(NULL) {}
8+
T data;
9+
stack_element<T>* next;
10+
};
11+
12+
template<typename T>
13+
class stack
14+
{
15+
public:
16+
stack() :m_size(0), m_begin_element(NULL), m_current_element(NULL),
17+
m_top_element(NULL) {}
18+
19+
~stack()
20+
{
21+
stack_element<T>* tmp = m_begin_element;
22+
23+
while (tmp)
24+
{
25+
delete tmp;
26+
tmp = tmp->next;
27+
}
28+
29+
m_begin_element = NULL;
30+
m_current_element = NULL;
31+
m_top_element = NULL;
32+
}
33+
34+
int size()
35+
{
36+
return m_size;
37+
}
38+
39+
stack_element<T>* top()
40+
{
41+
if (m_top_element == NULL)
42+
m_top_element = m_begin_element;
43+
else
44+
m_top_element = m_top_element->next;
45+
46+
return m_top_element;
47+
}
48+
49+
void push(T data)
50+
{
51+
stack_element<T>* tmp = new stack_element<T>();
52+
53+
if (tmp == NULL)
54+
return;
55+
56+
tmp->data = data;
57+
tmp->next = NULL;
58+
59+
if (m_begin_element == NULL)
60+
m_begin_element = tmp;
61+
else
62+
m_current_element->next = tmp;
63+
64+
m_current_element = tmp;
65+
m_size++;
66+
}
67+
68+
void pop()
69+
{
70+
stack_element<T>* tmp = NULL;
71+
72+
if (m_begin_element == NULL || m_current_element == NULL)
73+
return;
74+
75+
tmp = m_begin_element;
76+
while (tmp)
77+
{
78+
if (tmp->next == m_current_element)
79+
{
80+
delete tmp->next;
81+
tmp->next = NULL;
82+
m_current_element = tmp;
83+
m_size--;
84+
break;
85+
}
86+
tmp = tmp->next;
87+
}
88+
}
89+
90+
void travel()
91+
{
92+
stack_element<T>* tmp = m_begin_element;
93+
94+
while (tmp)
95+
{
96+
std::cout << tmp->data << '\t';
97+
tmp = tmp->next;
98+
}
99+
std::cout << std::endl;
100+
}
101+
102+
private:
103+
int m_size;
104+
stack_element<T>* m_begin_element;
105+
stack_element<T>* m_current_element;
106+
stack_element<T>* m_top_element;
107+
};
108+
109+
int main(int argc, char* argv[])
110+
{
111+
stack<int> stack_obj;
112+
int i;
113+
114+
for (i = 0; i < 10; i++)
115+
{
116+
stack_obj.push(i);
117+
}
118+
std::cout << "DEBUG: top " << stack_obj.top()->data << std::endl;
119+
std::cout << "DEBUG: top " << stack_obj.top()->data << std::endl;
120+
std::cout << "DEBUG: top " << stack_obj.top()->data << std::endl;
121+
std::cout << "DEBUG: travel" << std::endl;
122+
stack_obj.travel();
123+
std::cout << "DEBUG: pop" << std::endl;
124+
stack_obj.pop();
125+
std::cout << "DEBUG: travel" << std::endl;
126+
stack_obj.travel();
127+
std::cout << "DEBUG: push 66" << std::endl;
128+
stack_obj.push(66);
129+
std::cout << "DEBUG: travel" << std::endl;
130+
stack_obj.travel();
131+
132+
return 0;
133+
}

0 commit comments

Comments
 (0)