Skip to content

Commit 28287e3

Browse files
Stack queue in cpp (#936)
* adding c++ implementation of stack and queue * improved some comments * Update contents/stacks_and_queues/code/c++/queue.cpp adding version T const& front() const Co-authored-by: Dimitri Belopopsky <ShadowMitia@users.noreply.github.com> * Update contents/stacks_and_queues/code/c++/queue.cpp removing unnecessary comment Co-authored-by: Dimitri Belopopsky <ShadowMitia@users.noreply.github.com> * improved implementation * fixed queue implementation * renamed queue API push as enqueue * Rename code folder to cpp * Inline newlines Co-authored-by: Dimitri Belopopsky <ShadowMitia@users.noreply.github.com> Co-authored-by: Dimitri Belopopsky <dimitri@belopopsky.com>
1 parent 015489e commit 28287e3

File tree

3 files changed

+181
-0
lines changed

3 files changed

+181
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#include<iostream>
2+
#include<memory>
3+
#include<cassert>
4+
5+
namespace my {
6+
/**
7+
* implementation using linked list
8+
* [value][next] -> [value][next] -> ... -> [value][next]
9+
* (front Node) (intermediat Nodes) (rear Node)
10+
*/
11+
template<typename T>
12+
struct Node {
13+
/**
14+
* next: will store right Node address
15+
*/
16+
T value;
17+
std::shared_ptr<Node<T>> next;
18+
Node(const T& V) : value(V) { }
19+
};
20+
21+
template<typename T>
22+
class queue {
23+
private:
24+
/**
25+
* front_pointer: points to left most node
26+
* count: keeps track of current number of elements present in queue
27+
* rear_pointer: points to most recent Node added into the queue, which is right most Node
28+
*/
29+
std::shared_ptr<Node<T>> front_pointer;
30+
std::shared_ptr<Node<T>> rear_pointer;
31+
size_t count;
32+
public:
33+
queue() : count(0ULL) { }
34+
35+
void enqueue(const T& element) {
36+
auto new_node = std::make_shared<Node<T>>(element);
37+
if (count > 0) {
38+
rear_pointer->next = new_node;
39+
rear_pointer = new_node;
40+
} else {
41+
rear_pointer = front_pointer = new_node;
42+
}
43+
count = count + 1;
44+
}
45+
46+
void dequeue() {
47+
if (count > 1) {
48+
front_pointer = front_pointer->next;
49+
count = count - 1;
50+
} else if (count == 1) {
51+
front_pointer.reset();
52+
rear_pointer.reset();
53+
count = count - 1;
54+
}
55+
}
56+
57+
T& front() {
58+
assert(count > 0 && "calling front on an empty queue");
59+
return front_pointer->value;
60+
}
61+
62+
T const& front() const {
63+
assert(count > 0 && "calling front on an empty queue");
64+
return front_pointer->value;
65+
}
66+
67+
size_t size() const { return count; }
68+
69+
bool empty() const { return count == 0; }
70+
71+
~queue() {
72+
while (front_pointer.get() != nullptr) {
73+
front_pointer = front_pointer->next;
74+
}
75+
}
76+
};
77+
}
78+
79+
int main() {
80+
my::queue<int> intQueue;
81+
intQueue.enqueue(4);
82+
intQueue.enqueue(5);
83+
intQueue.enqueue(9);
84+
85+
int frontElement = intQueue.front();
86+
intQueue.dequeue();
87+
std::cout << frontElement << '\n';
88+
std::cout << intQueue.size() << '\n';
89+
std::cout << intQueue.front() << '\n';
90+
return 0;
91+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include<iostream>
2+
#include<cassert>
3+
#include<memory>
4+
5+
namespace my {
6+
/**
7+
* implementation using linked list
8+
* [value][next] -> [value][next] -> ... -> [value][next]
9+
* (top Node) (intermediat Nodes)
10+
* left most Node represents top element of stack
11+
*/
12+
template<typename T>
13+
struct Node {
14+
/**
15+
* next: will store right Node address
16+
*/
17+
T value;
18+
std::unique_ptr<Node<T>> next;
19+
Node(const T& V) : value(V) { }
20+
};
21+
22+
template<typename T>
23+
class stack {
24+
private:
25+
/**
26+
* top_pointer: points to left most node
27+
* count: keeps track of current number of elements present in stack
28+
*/
29+
std::unique_ptr<Node<T>> top_pointer;
30+
size_t count;
31+
public:
32+
stack() : count(0ULL) { }
33+
34+
void push(const T& element) {
35+
auto new_node = std::make_unique<Node<T>>(element);
36+
new_node->next = std::move(top_pointer);
37+
top_pointer = std::move(new_node);
38+
count = count + 1;
39+
}
40+
41+
void pop() {
42+
if (count > 0) {
43+
top_pointer = std::move(top_pointer->next);
44+
count = count - 1;
45+
}
46+
}
47+
48+
T& top() {
49+
assert(count > 0 and "calling top() on an empty stack");
50+
return top_pointer->value;
51+
}
52+
// returning mutable reference can very be usefull if someone wants to modify top element
53+
54+
T const& top() const {
55+
assert(count > 0 and "calling top() on an empty stack");
56+
return top_pointer->value;
57+
}
58+
59+
size_t size() const { return count; }
60+
61+
bool empty() const { return count == 0; }
62+
63+
~stack() {
64+
while (top_pointer.get() != nullptr) {
65+
top_pointer = std::move(top_pointer->next);
66+
}
67+
}
68+
};
69+
}
70+
71+
int main() {
72+
my::stack<int> intStack;
73+
74+
intStack.push(4);
75+
intStack.push(5);
76+
intStack.push(9);
77+
78+
int topElement = intStack.top();
79+
intStack.pop();
80+
std::cout << topElement << '\n';
81+
std::cout << intStack.size() << '\n';
82+
std::cout << intStack.top() << '\n';
83+
return 0;
84+
}

contents/stacks_and_queues/stacks_and_queues.md

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ Here is a simple implementation of a stack:
1919
{% sample lang="ts" %}
2020
[import, lang:"typescript"](code/typescript/stack.ts)
2121
{% sample lang="java" %}
22+
[import, lang:"java"](code/java/Stack.java)
23+
{% sample lang = "cpp"%}
24+
[import, lang:"cpp"](code/cpp/stack.cpp)
2225
[import, lang:"java"](code/java/StackTest.java)
2326
{% sample lang="rust" %}
2427
[import, lang:"rust"](code/rust/Stack.rs)
@@ -29,6 +32,9 @@ Here is a simple implementation of a queue:
2932
{% sample lang="ts" %}
3033
[import, lang:"typescript"](code/typescript/queue.ts)
3134
{% sample lang="java" %}
35+
[import, lang:"java" ](code/java/Queue.java)
36+
{% sample lang = "cpp"%}
37+
[import, lang:"cpp"](code/cpp/queue.cpp)
3238
[import, lang:"java" ](code/java/QueueTest.java)
3339
{% sample lang="rust" %}
3440
[import, lang:"rust" ](code/rust/Queue.rs)

0 commit comments

Comments
 (0)