Skip to content

Commit d5abb31

Browse files
committed
some files updated
1 parent fc96dc2 commit d5abb31

30 files changed

+1654
-704
lines changed
Binary file not shown.
Lines changed: 86 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,87 @@
1+
import unittest
2+
3+
# Author: Robert Joseph
4+
15
class CircularQueue:
2-
def init(self, max_size):
3-
self.items = [None] * max_size
4-
self.front = 0
5-
self.rear = 0
6-
self.max_size = max_size
7-
8-
def enqueue(self, item):
9-
if (self.rear + 1) % self.max_size == self.front:
10-
print("Queue is full")
11-
return
12-
self.items[self.rear] = item
13-
self.rear = (self.rear + 1) % self.max_size
14-
15-
def dequeue(self):
16-
if self.front == self.rear:
17-
print("Queue is empty")
18-
return
19-
item = self.items[self.front]
20-
self.items[self.front] = None
21-
self.front = (self.front + 1) % self.max_size
22-
return item
23-
24-
def peek(self):
25-
return self.items[self.front]
26-
27-
def is_empty(self):
28-
return self.front == self.rear
29-
30-
def size(self):
31-
return (self.rear - self.front + self.max_size) % self.max_size
6+
def __init__(self, max_size):
7+
"""
8+
This function initializes a circular queue with a maximum size.
9+
"""
10+
self.items = [None] * max_size
11+
self.front = 0
12+
self.rear = 0
13+
self.max_size = max_size
14+
15+
def enqueue(self, item):
16+
"""
17+
This function adds an item to the circular queue.
18+
"""
19+
if (self.rear + 1) % self.max_size == self.front:
20+
print("Queue is full")
21+
return
22+
self.items[self.rear] = item
23+
self.rear = (self.rear + 1) % self.max_size
24+
25+
def dequeue(self):
26+
"""
27+
This function removes an item from the circular queue and returns it.
28+
"""
29+
if self.front == self.rear:
30+
print("Queue is empty")
31+
return
32+
item = self.items[self.front]
33+
self.items[self.front] = None
34+
self.front = (self.front + 1) % self.max_size
35+
return item
36+
37+
def peek(self):
38+
"""
39+
This function returns the item at the front of the circular queue.
40+
"""
41+
return self.items[self.front]
42+
43+
def is_empty(self):
44+
"""
45+
This function checks if the circular queue is empty.
46+
"""
47+
return self.front == self.rear
48+
49+
def size(self):
50+
"""
51+
This function returns the current size of the circular queue.
52+
"""
53+
return (self.rear - self.front + self.max_size) % self.max_size
54+
55+
56+
class TestCircularQueue(unittest.TestCase):
57+
def test_circular_queue(self):
58+
# Test empty queue
59+
cq = CircularQueue(5)
60+
self.assertTrue(cq.is_empty())
61+
self.assertEqual(cq.size(), 0)
62+
63+
# Test enqueue
64+
cq.enqueue(1)
65+
cq.enqueue(2)
66+
cq.enqueue(3)
67+
self.assertFalse(cq.is_empty())
68+
self.assertEqual(cq.size(), 3)
69+
70+
# Test dequeue
71+
item = cq.dequeue()
72+
self.assertEqual(item, 1)
73+
self.assertEqual(cq.size(), 2)
74+
75+
# Test peek
76+
peek_item = cq.peek()
77+
self.assertEqual(peek_item, 2)
78+
79+
# Test full queue
80+
cq.enqueue(4)
81+
cq.enqueue(5)
82+
cq.enqueue(6) # This should print "Queue is full"
83+
self.assertEqual(cq.size(), 4)
84+
85+
86+
if __name__ == '__main__':
87+
unittest.main()
Lines changed: 115 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,118 @@
1+
import unittest
2+
3+
# Author: Robert Joseph
4+
5+
16
class Node:
2-
def init(self, data=None, next_node=None, prev_node=None):
3-
self.data = data
4-
self.next_node = next_node
5-
self.prev_node = prev_node
7+
def __init__(self, data=None, next_node=None, prev_node=None):
8+
"""
9+
This class represents a node in a doubly linked list.
10+
Each node contains data, a reference to the next node, and a reference to the previous node.
11+
"""
12+
self.data = data
13+
self.next_node = next_node
14+
self.prev_node = prev_node
15+
616

717
class LinkedList:
8-
def init(self):
9-
self.head = None
10-
self.tail = None
11-
12-
def append(self, data):
13-
new_node = Node(data)
14-
if self.head is None:
15-
self.head = new_node
16-
self.tail = new_node
17-
else:
18-
self.tail.next_node = new_node
19-
new_node.prev_node = self.tail
20-
self.tail = new_node
21-
22-
def prepend(self, data):
23-
new_node = Node(data)
24-
if self.head is None:
25-
self.head = new_node
26-
self.tail = new_node
27-
else:
28-
self.head.prev_node = new_node
29-
new_node.next_node = self.head
30-
self.head = new_node
31-
32-
def delete(self, data):
33-
current_node = self.head
34-
while current_node is not None:
35-
if current_node.data == data:
36-
if current_node.prev_node is not None:
37-
current_node.prev_node.next_node = current_node.next_node
38-
if current_node.next_node is not None:
39-
current_node.next_node.prev_node = current_node.prev_node
40-
if current_node == self.head:
41-
self.head = current_node.next_node
42-
if current_node == self.tail:
43-
self.tail = current_node.prev_node
44-
current_node = current_node.next_node
45-
46-
def search(self, data):
47-
current_node = self.head
48-
while current_node is not None:
49-
if current_node.data == data:
50-
return current_node
51-
current_node = current_node.next_node
52-
return None
53-
54-
def print_list(self):
55-
current_node = self.head
56-
while current_node is not None:
57-
print(current_node.data)
58-
current_node = current_node.next_node
18+
def __init__(self):
19+
"""
20+
This class represents a doubly linked list.
21+
It contains a reference to the head (the first node) and the tail (the last node) of the list.
22+
"""
23+
self.head = None
24+
self.tail = None
25+
26+
def append(self, data):
27+
"""
28+
Appends a new node with the given data to the end of the linked list.
29+
Time complexity: O(1)
30+
"""
31+
new_node = Node(data)
32+
if self.head is None:
33+
self.head = new_node
34+
self.tail = new_node
35+
else:
36+
self.tail.next_node = new_node
37+
new_node.prev_node = self.tail
38+
self.tail = new_node
39+
40+
def prepend(self, data):
41+
"""
42+
Prepends a new node with the given data to the beginning of the linked list.
43+
Time complexity: O(1)
44+
"""
45+
new_node = Node(data)
46+
if self.head is None:
47+
self.head = new_node
48+
self.tail = new_node
49+
else:
50+
self.head.prev_node = new_node
51+
new_node.next_node = self.head
52+
self.head = new_node
53+
54+
def delete(self, data):
55+
"""
56+
Deletes the first occurrence of a node with the given data from the linked list.
57+
Time complexity: O(n)
58+
"""
59+
current_node = self.head
60+
while current_node is not None:
61+
if current_node.data == data:
62+
if current_node.prev_node is not None:
63+
current_node.prev_node.next_node = current_node.next_node
64+
if current_node.next_node is not None:
65+
current_node.next_node.prev_node = current_node.prev_node
66+
if current_node == self.head:
67+
self.head = current_node.next_node
68+
if current_node == self.tail:
69+
self.tail = current_node.prev_node
70+
current_node = current_node.next_node
71+
72+
def search(self, data):
73+
"""
74+
Searches for the first occurrence of a node with the given data in the linked list.
75+
Returns the node if found, None otherwise.
76+
Time complexity: O(n)
77+
"""
78+
current_node = self.head
79+
while current_node is not None:
80+
if current_node.data == data:
81+
return current_node
82+
current_node = current_node.next_node
83+
return None
84+
85+
def print_list(self):
86+
"""
87+
Prints the elements of the linked list.
88+
Time complexity: O(n)
89+
"""
90+
current_node = self.head
91+
while current_node is not None:
92+
print(current_node.data)
93+
current_node = current_node.next_node
94+
95+
96+
class TestLinkedList(unittest.TestCase):
97+
def test_linked_list(self):
98+
# Initialize the linked list
99+
linked_list = LinkedList()
100+
101+
# Append nodes
102+
linked_list.append(1)
103+
linked_list.append(2)
104+
linked_list.append(3)
105+
106+
# Test the print_list method
107+
self.assertEqual(linked_list.print_list(), None) # No return value, so None is expected
108+
109+
# Test the search method
110+
self.assertEqual(linked_list.search(2), linked_list.head.next_node) # The second node should contain 2
111+
112+
# Test the delete method
113+
linked_list.delete(2)
114+
self.assertEqual(linked_list.search(2), None) # The node with data 2 should no longer exist
115+
116+
117+
if __name__ == '__main__':
118+
unittest.main()

0 commit comments

Comments
 (0)