Skip to content

Commit ec2dec3

Browse files
committed
Added queue implementation
1 parent b9c880f commit ec2dec3

File tree

10 files changed

+1052
-0
lines changed

10 files changed

+1052
-0
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
* @file ArrayQueue.h
3+
* @author (original JAVA) William Fiset, [email protected]
4+
* liujingkun, [email protected]
5+
* (conversion to C++) Armin Zare Zadeh, [email protected]
6+
* @date 03 July 2020
7+
* @version 0.1
8+
* @brief An array implementation of a queue.
9+
*/
10+
11+
#ifndef D_ARRAY_QUEUE_H
12+
#define D_ARRAY_QUEUE_H
13+
14+
#include <Queue.h>
15+
16+
#include <deque>
17+
#include <vector>
18+
#include <set> // set and multiset
19+
#include <map> // map and multimap
20+
#include <unordered_set> // unordered set/multiset
21+
#include <unordered_map> // unordered map/multimap
22+
#include <iterator>
23+
#include <algorithm>
24+
#include <numeric> // some numeric algorithm
25+
#include <functional>
26+
#include <stack>
27+
28+
#include <sstream>
29+
#include <memory>
30+
#include <iostream>
31+
#include <stdexcept>
32+
33+
namespace dsa {
34+
35+
36+
template <typename T>
37+
class ArrayQueue : public Queue<T> {
38+
private:
39+
std::vector<T> data_;
40+
int front_;
41+
int rear_;
42+
43+
public:
44+
ArrayQueue(int id, int capacity) : Queue<T>(id) {
45+
// ArrayQueue maximum size is data.length - 1.
46+
data_= std::vector<T>(capacity + 1, 0);
47+
front_ = 0;
48+
rear_ = 0;
49+
}
50+
51+
52+
~ArrayQueue() {
53+
data_.clear();
54+
}
55+
56+
void clear() override {
57+
front_ = 0;
58+
rear_ = 0;
59+
}
60+
61+
void offer(T elem) override {
62+
if (isFull()) {
63+
throw std::runtime_error("Queue Full");
64+
}
65+
data_[rear_++] = elem;
66+
rear_ = adjustIndex(rear_, data_.size());
67+
}
68+
69+
70+
T poll() override {
71+
if (isEmpty()) {
72+
throw std::runtime_error("Queue Empty");
73+
}
74+
75+
front_ = adjustIndex(front_, data_.size());
76+
return (T) data_[front_++];
77+
}
78+
79+
80+
T peek() override {
81+
if (isEmpty()) {
82+
throw std::runtime_error("Queue Empty");
83+
}
84+
front_ = adjustIndex(front_, data_.size());
85+
return (T) data_[front_];
86+
}
87+
88+
89+
int size() override {
90+
return adjustIndex(rear_ + data_.size() - front_, data_.size());
91+
}
92+
93+
94+
bool isEmpty() override {
95+
return rear_ == front_;
96+
}
97+
98+
bool isFull() {
99+
return (front_ + data_.size() - rear_) % data_.size() == 1;
100+
}
101+
102+
private:
103+
int adjustIndex(int index, int size) {
104+
return index >= size ? index - size : index;
105+
}
106+
};
107+
108+
} // namespace dsa
109+
110+
#endif /* D_ARRAY_QUEUE_H */
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/*
2+
* @file LinkedQueue.h
3+
* @author (original JAVA) William Fiset, [email protected]
4+
* (conversion to C++) Armin Zare Zadeh, [email protected]
5+
* @date 03 July 2020
6+
* @version 0.1
7+
* @brief A simple queue implementation with a linkedlist.
8+
*/
9+
10+
11+
#ifndef D_LINKLIST_QUEUE_H
12+
#define D_LINKLIST_QUEUE_H
13+
14+
#include <Queue.h>
15+
16+
#include <deque>
17+
#include <list>
18+
#include <set> // set and multiset
19+
#include <map> // map and multimap
20+
#include <unordered_set> // unordered set/multiset
21+
#include <unordered_map> // unordered map/multimap
22+
#include <iterator>
23+
#include <algorithm>
24+
#include <numeric> // some numeric algorithm
25+
#include <functional>
26+
#include <stack>
27+
28+
#include <sstream>
29+
#include <memory>
30+
#include <iostream>
31+
#include <stdexcept>
32+
33+
namespace dsa {
34+
35+
template <typename T>
36+
class LinkedQueue : public Queue<T> {
37+
38+
private:
39+
std::list<T> list_;
40+
41+
public:
42+
// Create an empty stack
43+
LinkedQueue(int id) : Queue<T>(id) {}
44+
45+
LinkedQueue(int id, T firstElem) : Queue<T>(id) {
46+
offer(firstElem);
47+
}
48+
49+
~LinkedQueue() {
50+
list_.clear();
51+
}
52+
53+
// Iterator class can be used to sequentially access nodes of queue
54+
class Iterator
55+
{
56+
public:
57+
58+
Iterator() noexcept : it_ (list_.begin()) {
59+
}
60+
61+
Iterator& operator=(typename std::list<T>::iterator& it)
62+
{
63+
this->it_ = it;
64+
return *this;
65+
}
66+
67+
// Prefix ++ overload
68+
Iterator& operator++()
69+
{
70+
if (it_)
71+
it_++;
72+
return *this;
73+
}
74+
75+
// Postfix ++ overload
76+
Iterator operator++(int)
77+
{
78+
Iterator iterator = *this;
79+
++*this;
80+
return iterator;
81+
}
82+
83+
bool operator!=(const Iterator& iterator)
84+
{
85+
return it_ != iterator.it_;
86+
}
87+
88+
T operator*()
89+
{
90+
return *it_;
91+
}
92+
93+
private:
94+
const typename std::list<T>::iterator it_;
95+
};
96+
97+
void clear() override {
98+
list_.clear();
99+
}
100+
101+
// Return the size of the queue
102+
int size() override {
103+
return list_.size();
104+
}
105+
106+
// Returns whether or not the queue is empty
107+
bool isEmpty() override {
108+
return size() == 0;
109+
}
110+
111+
// Peek the element at the front of the queue
112+
// The method throws an error is the queue is empty
113+
T peek() override {
114+
if (isEmpty()) throw std::runtime_error("Queue Empty");
115+
return list_.front();
116+
}
117+
118+
// Poll an element from the front of the queue
119+
// The method throws an error if the queue is empty
120+
T poll() override {
121+
if (isEmpty()) throw std::runtime_error("Queue Empty");
122+
T f = list_.front();
123+
list_.erase(list_.begin());
124+
return f;
125+
}
126+
127+
// Add an element to the back of the queue
128+
void offer(T elem) override {
129+
list_.push_back(elem);
130+
}
131+
132+
};
133+
134+
} // namespace dsa
135+
136+
#endif /* D_LINKLIST_QUEUE_H */
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* @file Queue.h
3+
* @author (original JAVA) William Fiset, [email protected]
4+
* liujingkun, [email protected]
5+
* (conversion to C++) Armin Zare Zadeh, [email protected]
6+
* @date 03 July 2020
7+
* @version 0.1
8+
* @brief An abstract base class for queue.
9+
*/
10+
11+
#ifndef D_QUEUE_H
12+
#define D_QUEUE_H
13+
14+
#include <deque>
15+
#include <list>
16+
#include <set> // set and multiset
17+
#include <map> // map and multimap
18+
#include <unordered_set> // unordered set/multiset
19+
#include <unordered_map> // unordered map/multimap
20+
#include <iterator>
21+
#include <algorithm>
22+
#include <numeric> // some numeric algorithm
23+
#include <functional>
24+
#include <stack>
25+
26+
#include <sstream>
27+
#include <memory>
28+
#include <iostream>
29+
#include <stdexcept>
30+
31+
namespace dsa {
32+
33+
template <typename T>
34+
class Queue
35+
{
36+
private:
37+
int id_;
38+
39+
public:
40+
Queue(int id) : id_(id) {}
41+
42+
virtual ~Queue() {}
43+
44+
virtual void clear() = 0;
45+
46+
virtual void offer(T elem) = 0;
47+
48+
virtual T poll() = 0;
49+
50+
virtual T peek() = 0;
51+
52+
virtual int size() = 0;
53+
54+
virtual bool isEmpty() = 0;
55+
};
56+
57+
} // namespace dsa
58+
59+
#endif /* D_QUEUE_H */
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
'''
2+
* @file ArrayStack.py
3+
* @author (original JAVA) William Fiset, [email protected]
4+
* liujingkun, [email protected]
5+
* (conversion to Python) Armin Zare Zadeh, [email protected]
6+
* @date 22 Jun 2020
7+
* @version 0.1
8+
* @brief An array implementation of a queue.
9+
'''
10+
11+
from Queue import Queue
12+
13+
class ArrayQueue(Queue):
14+
'''
15+
An array implementation of a stack
16+
'''
17+
def __init__(self, obj, capacity):
18+
self.qSize = 0
19+
self.data = [obj for i in range(capacity)]
20+
self.front = 0
21+
self.rear = 0
22+
23+
24+
def size(self):
25+
return self.adjustIndex(self.rear + len(self.data) - self.front, len(self.data))
26+
27+
28+
def offer(self, elem):
29+
if self.isFull():
30+
raise Exception('Queue is full')
31+
32+
self.data[self.rear] = elem
33+
self.rear += 1
34+
self.rear = self.adjustIndex(self.rear, len(self.data))
35+
36+
37+
def poll(self):
38+
if self.isEmpty():
39+
raise Exception('Queue is empty')
40+
self.front = self.adjustIndex(self.front, len(self.data))
41+
d = self.data[self.front]
42+
self.front += 1
43+
return d
44+
45+
46+
def peek(self):
47+
if self.isEmpty():
48+
raise Exception('Queue is empty')
49+
self.front = self.adjustIndex(self.front, len(self.data))
50+
return self.data[self.front]
51+
52+
53+
def isEmpty(self):
54+
return self.rear == self.front
55+
56+
57+
def isFull(self):
58+
return (self.front + len(self.data) - self.rear) % len(self.data) == 1
59+
60+
61+
def adjustIndex(self, index, size):
62+
return index - size if index >= size else index
63+
64+
65+
if __name__ == '__main__':
66+
q = ArrayQueue(0, 6)
67+
68+
q.offer(1);
69+
q.offer(2);
70+
q.offer(3);
71+
q.offer(4);
72+
q.offer(5);
73+
74+
print(q.poll()) # 1
75+
print(q.poll()) # 2
76+
print(q.poll()) # 3
77+
print(q.poll()) # 4
78+
79+
print(q.isEmpty()) # false
80+
81+
q.offer(1)
82+
q.offer(2)
83+
q.offer(3)
84+
85+
print(q.poll()) # 5
86+
print(q.poll()) # 1
87+
print(q.poll()) # 2
88+
print(q.poll()) # 3
89+
90+
print(q.isEmpty()) # true

0 commit comments

Comments
 (0)