Skip to content

Commit 1b19196

Browse files
committed
adding c++ implementation of stack and queue
1 parent edffc2d commit 1b19196

File tree

3 files changed

+189
-0
lines changed

3 files changed

+189
-0
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#include<iostream>
2+
using namespace std;
3+
4+
5+
namespace my {
6+
/**
7+
*implementation using parameterised linked list
8+
* [value][next] -> [value][next] -> ... -> [value][next] -> [value][next]
9+
* (front Node) (intermediat elements) (rear Node) (dummy Node)
10+
*/
11+
template<typename T>
12+
struct Node {
13+
/**
14+
* next: will store next Node(right) address
15+
*/
16+
T value;
17+
Node<T>* next;
18+
Node(const T& V) : value(V), next(nullptr) { }
19+
};
20+
21+
template<typename T>
22+
class queue {
23+
private:
24+
/**
25+
* variabel: _front points to left most node , right most Node is dummy Node
26+
* count: will keep track of current number of elements present in stack excluding dummy Node
27+
*/
28+
Node<T>* _front;
29+
Node<T>* rear;
30+
size_t count;
31+
public:
32+
queue() : _front(nullptr), rear(nullptr), count(0ULL) {
33+
_front = rear = new Node<T>(0); // creating a dummy Node
34+
}
35+
36+
void push(const T& element) {
37+
Node<T>* new_node = new Node<T>(element); // create New Node
38+
if (count > 0) {
39+
new_node->next = rear->next; // make buffer point to dummy Node
40+
rear->next = new_node; // make rear Node point to buffer
41+
rear = new_node; // make rear pointer to point to buffer
42+
} else {
43+
new_node->next = rear;
44+
rear = _front = new_node;
45+
}
46+
count = count + 1;
47+
}
48+
49+
void dequeue() {
50+
if (count > 0) {
51+
Node<T>* buffer = _front;
52+
_front = _front->next;
53+
count = count - 1;
54+
delete buffer;
55+
}
56+
rear = (count != 0) ? rear : _front;
57+
}
58+
59+
T& front() const { return _front->value; }
60+
// returning reference can very usefull if someone wants to modify _front element
61+
62+
size_t size() const { return count; }
63+
64+
bool empty() const { return count == 0; }
65+
66+
~queue() {
67+
for (Node<T>* pointer = _front; pointer != nullptr;) {
68+
Node<T>* buffer = pointer;
69+
pointer = pointer->next;
70+
delete buffer;
71+
}
72+
}
73+
};
74+
}
75+
76+
int main() {
77+
my::queue<int> Q;
78+
79+
Q.push(0);
80+
Q.push(1);
81+
Q.push(2);
82+
Q.push(3);
83+
84+
cout << "count: " << Q.size() << endl;
85+
86+
Q.front() = 10;
87+
88+
while (Q.empty() != true) {
89+
cout << "element: " << Q.front() << endl;
90+
Q.dequeue();
91+
}
92+
93+
Q.push(3);
94+
Q.push(6);
95+
cout << "count: " << Q.size() << endl;
96+
while (Q.empty() != true) {
97+
cout << "element: " << Q.front() << endl;
98+
Q.dequeue();
99+
}
100+
return 0;
101+
}
102+
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
2+
#include<iostream>
3+
using namespace std;
4+
5+
namespace my {
6+
/**
7+
*implementation using parameterised linked list
8+
* [value][next] -> [value][next] -> ... -> [value][next]
9+
* (top Node) (intermediat Nodes) (dummy Node)
10+
* left most Node represents_top element of stack
11+
* right most Node is a dummy Node
12+
*/
13+
template<typename T>
14+
struct Node {
15+
/**
16+
* next: will store next Node(right) address
17+
*/
18+
T value;
19+
Node<T>* next;
20+
Node(const T& V) : value(V), next(nullptr) { }
21+
};
22+
23+
template<typename T>
24+
class stack {
25+
private:
26+
/**
27+
* variabel:_top points to left most node , right most Node is dummy Node
28+
* count: will keep track of current number of elements present in stack excluding dummy Node
29+
*/
30+
Node<T>* _top;
31+
size_t count;
32+
public:
33+
stack() : _top(nullptr), count(0ULL) {
34+
_top = new Node<T>(0); // creating a dummy node
35+
}
36+
37+
void push(const T& element) {
38+
Node<T>* buffer = new Node<T>(element);
39+
buffer->next = _top;
40+
_top = buffer;
41+
count = count + 1;
42+
}
43+
44+
void pop() {
45+
if (count > 0) {
46+
Node<T>* buffer = _top;
47+
_top = _top->next;
48+
count = count - 1;
49+
delete buffer;
50+
}
51+
}
52+
53+
T& top() const { return _top->value; }
54+
// returning reference can very usefull if someone wants to modify top element
55+
56+
size_t size() const { return count; }
57+
58+
bool empty() const { return count == 0; }
59+
60+
~stack() {
61+
for (Node<T>* pointer = _top; pointer != nullptr;) {
62+
Node<T>* buffer = pointer;
63+
pointer = pointer->next;
64+
delete buffer;
65+
}
66+
}
67+
};
68+
}
69+
70+
int main() {
71+
my::stack<int> S;
72+
S.push(0);
73+
S.push(1);
74+
S.push(2);
75+
S.push(3);
76+
cout << "size: " << S.size() << endl;
77+
S.top() = 10;
78+
while (S.empty() != true) {
79+
cout << "element: " << S.top() << endl;
80+
S.pop();
81+
}
82+
return 0;
83+
}

contents/stacks_and_queues/stacks_and_queues.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ Here is a simple implementation of a stack:
2020
[import, lang:"typescript"](code/typescript/stack.ts)
2121
{% sample lang="java" %}
2222
[import, lang:"java"](code/java/Stack.java)
23+
{% sample lang = "cpp"%}
24+
[import, lang:"cpp"](code/c++/stack.cpp)
2325
{% endmethod %}
2426

2527
Here is a simple implementation of a queue:
@@ -28,6 +30,8 @@ Here is a simple implementation of a queue:
2830
[import, lang:"typescript"](code/typescript/queue.ts)
2931
{% sample lang="java" %}
3032
[import, lang:"java" ](code/java/Queue.java)
33+
{% sample lang = "cpp"%}
34+
[import, lang:"cpp"](code/c++/queue.cpp)
3135
{% endmethod %}
3236

3337

0 commit comments

Comments
 (0)