Skip to content

Commit 7a4c099

Browse files
bose-sayanraklaptudirmtjgurwara99
authored
feat: Add deque structure (#659)
* Added Doubly Ended Queue data structure and a few tests to check * Added the doubly ended queue data structure along with a few tests and fixed some linting issues * Added the necessary changes: - Made the member of the DoublyEndedQueue struct private - Removed unnecessary indentations from package comment - Implemented black box testing - Used errors.New() to declare a constant error in case a dequeuing operation is called on an empty deque - Exported the methods of DoublyEndedQueue - Edited the names of getters to follow go's naming conventions. * Removed redundant zero valued variables * Transferred the test file to deque_test package * Removed redundant error variable in deque_test file * refactored the comments to satisfy godoc standard * corrected misspelled words * Update structure/deque/deque.go Refactored comments to be more descriptive Co-authored-by: Taj <[email protected]> * Update structure/deque/deque_test.go Removed redundant comments Co-authored-by: Taj <[email protected]> * removed redundant comments * Update structure/deque/deque.go Co-authored-by: Taj <[email protected]> * Renamed a few method names * Update structure/deque/deque.go Co-authored-by: Taj <[email protected]> * Renamed a few variables * Removed redundant comment --------- Co-authored-by: Rak Laptudirm <[email protected]> Co-authored-by: Taj <[email protected]>
1 parent a351eab commit 7a4c099

File tree

2 files changed

+490
-0
lines changed

2 files changed

+490
-0
lines changed

structure/deque/deque.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// description: Double Ended Queue is a generalized version of Queue data structure that allows insert and delete at both ends.
2+
// References:
3+
// Wikipedia : https://en.wikipedia.org/wiki/Double-ended_queue
4+
// Github: https://www.geeksforgeeks.org/deque-set-1-introduction-applications/
5+
// author [Sayan](https://github.com/bose-sayan)
6+
7+
// Package deque implements a Double Ended Queue data structure.
8+
package deque
9+
10+
import (
11+
"errors"
12+
)
13+
14+
// ErrEmptyDequeue is a custom error for handling cases when some dequeuing operation is performed on an empty deque.
15+
var ErrEmptyDequeue = errors.New("DoublyEnded queue is empty, so can't perform this operation")
16+
17+
type DoublyEndedQueue[T any] struct {
18+
deque []T
19+
}
20+
21+
// New returns a new DoublyEndedQueue.
22+
func New[T any]() *DoublyEndedQueue[T] {
23+
return &DoublyEndedQueue[T]{deque: make([]T, 0)}
24+
}
25+
26+
// EnqueueFront adds an item at the front of Deque.
27+
func (dq *DoublyEndedQueue[T]) EnqueueFront(item T) {
28+
dq.deque = append([]T{item}, dq.deque...)
29+
}
30+
31+
// EnqueueRear adds an item at the rear of Deque.
32+
func (dq *DoublyEndedQueue[T]) EnqueueRear(item T) {
33+
dq.deque = append(dq.deque, item)
34+
}
35+
36+
// DequeueFront deletes an item from front of Deque and returns it.
37+
func (dq *DoublyEndedQueue[T]) DequeueFront() (T, error) {
38+
if len(dq.deque) == 0 {
39+
var zeroVal T
40+
return zeroVal, ErrEmptyDequeue
41+
}
42+
frontElement := dq.deque[0]
43+
dq.deque = dq.deque[1:]
44+
return frontElement, nil
45+
}
46+
47+
// DequeueRear deletes an item from rear of Deque and returns it.
48+
func (dq *DoublyEndedQueue[T]) DequeueRear() (T, error) {
49+
if len(dq.deque) == 0 {
50+
var zeroVal T
51+
return zeroVal, ErrEmptyDequeue
52+
}
53+
rearElement := dq.deque[len(dq.deque)-1]
54+
dq.deque = dq.deque[:len(dq.deque)-1]
55+
return rearElement, nil
56+
}
57+
58+
// Front gets the front item from queue.
59+
func (dq *DoublyEndedQueue[T]) Front() (T, error) {
60+
if (len(dq.deque)) == 0 {
61+
var zeroVal T
62+
return zeroVal, ErrEmptyDequeue
63+
}
64+
return dq.deque[0], nil
65+
}
66+
67+
// Rear gets the last item from queue.
68+
func (dq *DoublyEndedQueue[T]) Rear() (T, error) {
69+
if (len(dq.deque)) == 0 {
70+
var zeroVal T
71+
return zeroVal, ErrEmptyDequeue
72+
}
73+
return dq.deque[len(dq.deque)-1], nil
74+
}
75+
76+
// IsEmpty checks whether Deque is empty or not.
77+
func (dq *DoublyEndedQueue[T]) IsEmpty() bool {
78+
return len(dq.deque) == 0
79+
}
80+
81+
// Length gets the length of Deque.
82+
func (dq *DoublyEndedQueue[T]) Length() int {
83+
return len(dq.deque)
84+
}

0 commit comments

Comments
 (0)