Skip to content

Commit ee80dc8

Browse files
committed
Chapter 6 Exercises completed
1 parent 58047e8 commit ee80dc8

File tree

10 files changed

+575
-199
lines changed

10 files changed

+575
-199
lines changed

.idea/workspace.xml

+201-198
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

06-Stacks-Queues-Deques/Exercises/Creativity/C6-20.py 06-Stacks-Queues-Deques/Exercises/Creativity/C6-22.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ def postfix(expr):
4141
# Testing
4242
if __name__ == "__main__":
4343
print(postfix('(A+B)*(C-D)/(E*F)'))
44-
print(postfix('(A/B^C-D)'))
44+
print(postfix('(A/B^C-D)'))
45+
print(postfix('((5+2)∗(8-3))/4'))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
class Empty(Exception):
2+
"""Error attempting to access an element from an empty container"""
3+
pass
4+
5+
class Full(Exception):
6+
"""Error attempting to insert an element to a full container"""
7+
pass
8+
9+
10+
class ArrayQueue:
11+
"""FIFO Queue implementation using Python list as underlying storage."""
12+
13+
DEFAULT_CAPACITY = 10
14+
15+
def __init__(self, maxlen = None):
16+
"""Create an empty queue."""
17+
18+
self._data = [None] * ArrayQueue.DEFAULT_CAPACITY
19+
self._size = 0
20+
self._front = 0
21+
self._maxlen = maxlen
22+
23+
def __len__(self):
24+
"""Return the number of elements in queue."""
25+
return self._size
26+
27+
def is_empty(self):
28+
"""Return True if the queue is empty."""
29+
return self._size == 0
30+
31+
def first(self):
32+
"""Return the element at the front of the queue.
33+
34+
Raise an exception if queue is empty.
35+
"""
36+
if self.is_empty():
37+
raise Empty('Queue is empty')
38+
return self._data[self._front]
39+
40+
def dequeue(self):
41+
"""Remove and return the first element of the queue.
42+
43+
Raise Empty exception is queue is empty.
44+
"""
45+
if self.is_empty():
46+
raise Empty('Queue is empty')
47+
answer = self._data[self._front]
48+
self._data[self._front] = None
49+
self._front = (self._front + 1) % len(self._data)
50+
self._size -= 1
51+
return answer
52+
53+
def enqueue(self, e):
54+
"""Add an element to back of queue."""
55+
if self._maxlen is not None and self._size == self._maxlen:
56+
raise Full('Capacity exceeded.!')
57+
58+
if self._size == len(self._data):
59+
self._resize(2 * len(self._data))
60+
avail = (self._size + self._front) % len(self._data)
61+
self._data[avail] = e
62+
self._size += 1
63+
64+
def _resize(self, cap):
65+
"""Resize to a new list of capacity >= len(self)"""
66+
old = self._data
67+
self._data = [None] * cap
68+
walk = self._front
69+
for k in range(self._size):
70+
self._data[k] = old[walk]
71+
walk = (1 + walk) % len(old)
72+
self._front = 0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
class Empty(Exception):
2+
"""Error attempting to access an element from an empty container"""
3+
pass
4+
5+
6+
class ArrayQueue:
7+
"""FIFO Queue implementation using Python list as underlying storage."""
8+
9+
DEFAULT_CAPACITY = 10
10+
11+
def __init__(self):
12+
"""Create an empty queue."""
13+
14+
self._data = [None] * ArrayQueue.DEFAULT_CAPACITY
15+
self._size = 0
16+
self._front = 0
17+
18+
def __len__(self):
19+
"""Return the number of elements in queue."""
20+
return self._size
21+
22+
def is_empty(self):
23+
"""Return True if the queue is empty."""
24+
return self._size == 0
25+
26+
def first(self):
27+
"""Return the element at the front of the queue.
28+
29+
Raise an exception if queue is empty.
30+
"""
31+
if self.is_empty():
32+
raise Empty('Queue is empty')
33+
return self._data[self._front]
34+
35+
def dequeue(self):
36+
"""Remove and return the first element of the queue.
37+
38+
Raise Empty exception is queue is empty.
39+
"""
40+
if self.is_empty():
41+
raise Empty('Queue is empty')
42+
answer = self._data[self._front]
43+
self._data[self._front] = None
44+
self._front = (self._front + 1) % len(self._data)
45+
self._size -= 1
46+
return answer
47+
48+
def enqueue(self, e):
49+
"""Add an element to back of queue."""
50+
if self._size == len(self._data):
51+
self._resize(2 * len(self._data))
52+
avail = (self._size + self._front) % len(self._data)
53+
self._data[avail] = e
54+
self._size += 1
55+
56+
def _resize(self, cap):
57+
"""Resize to a new list of capacity >= len(self)"""
58+
old = self._data
59+
self._data = [None] * cap
60+
walk = self._front
61+
for k in range(self._size):
62+
self._data[k] = old[walk]
63+
walk = (1 + walk) % len(old)
64+
self._front = 0
65+
66+
def rotate(self):
67+
"""Rotate the front element to the rear"""
68+
if self.is_empty():
69+
raise Empty('Queue is empty')
70+
answer = self._data[self._front]
71+
self._data[self._front] = None
72+
self._front = (self._front + 1) % len(self._data)
73+
avail = (self._size + self._front) % len(self._data)
74+
self._data[avail] = answer
75+
76+
def __str__(self):
77+
"""Return the Queue"""
78+
result = ''.join(str(self._data[i]) + " " for i in range(len(self._data)) if self._data[i] is not None)
79+
return result
80+
81+
# Testing
82+
if __name__ == "__main__":
83+
Queue = ArrayQueue()
84+
Queue.enqueue(10)
85+
Queue.enqueue(20)
86+
Queue.enqueue(30)
87+
Queue.enqueue(40)
88+
Queue.enqueue(50)
89+
print(Queue)
90+
Queue.rotate()
91+
print(Queue)
92+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import stackarray as Stack
2+
3+
def postfix_evaluate(expr):
4+
"""Evaluate the given postfix operation"""
5+
stack = Stack.ArrayStack()
6+
7+
operators = ['*','+','-','/','^']
8+
9+
for char in expr:
10+
if char not in operators:
11+
stack.push(int(char))
12+
else:
13+
num1 = stack.pop()
14+
num2 = stack.pop()
15+
16+
if char == '+':
17+
stack.push(num1+num2)
18+
elif char == '-':
19+
stack.push(num2-num1)
20+
elif char == '*':
21+
stack.push(num1 * num2)
22+
elif char == '/':
23+
stack.push(num2 // num1)
24+
25+
return stack.top()
26+
27+
# Testing
28+
if __name__ == "__main__":
29+
print(postfix_evaluate('53+83-*4/'))
30+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import arrayqueue as Queue
2+
3+
def capital_gain():
4+
5+
raw = 'start'
6+
queue_num = Queue.ArrayQueue()
7+
queue_amount = Queue.ArrayQueue()
8+
while raw != '' or raw != '\n':
9+
raw = input('Enter transaction details: \n')
10+
tokens = raw.split(' ')
11+
12+
if len(tokens) < 2:
13+
break
14+
15+
task = tokens[0]
16+
17+
total_shares = 0
18+
19+
if task == 'buy':
20+
queue_num.enqueue(int(tokens[1]))
21+
total_shares += int(tokens[1])
22+
amt = tokens[4]
23+
queue_amount.enqueue(int(amt[1:]))
24+
else:
25+
num_sold = int(tokens[1])
26+
amt = tokens[4]
27+
amt_sold = int(amt[1:])
28+
29+
capital_res = 0
30+
31+
while num_sold > 0 or not queue_num.is_empty():
32+
stock_num = queue_num.dequeue()
33+
if stock_num <= num_sold:
34+
num_sold -= stock_num
35+
capital_res += (amt_sold-queue_amount.dequeue())*stock_num
36+
else:
37+
capital_res += num_sold * (amt_sold-queue_amount.dequeue())
38+
num_sold = 0
39+
40+
return capital_res
41+
42+
43+
# Testing
44+
if __name__ == "__main__":
45+
print(capital_gain())
Binary file not shown.
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
class Empty(Exception):
2+
"""Error attempting to access an element from an empty container"""
3+
pass
4+
5+
class ArrayQueue:
6+
"""FIFO Queue implementation using Python list as underlying storage."""
7+
8+
DEFAULT_CAPACITY = 10
9+
10+
def __init__(self):
11+
"""Create an empty queue."""
12+
13+
self._data = [None]*ArrayQueue.DEFAULT_CAPACITY
14+
self._size = 0
15+
self._front = 0
16+
17+
def __len__(self):
18+
"""Return the number of elements in queue."""
19+
return self._size
20+
21+
def is_empty(self):
22+
"""Return True if the queue is empty."""
23+
return self._size == 0
24+
25+
def first(self):
26+
"""Return the element at the front of the queue.
27+
28+
Raise an exception if queue is empty.
29+
"""
30+
if self.is_empty():
31+
raise Empty('Queue is empty')
32+
return self._data[self._front]
33+
34+
def dequeue(self):
35+
"""Remove and return the first element of the queue.
36+
37+
Raise Empty exception is queue is empty.
38+
"""
39+
if self.is_empty():
40+
raise Empty('Queue is empty')
41+
answer = self._data[self._front]
42+
self._data[self._front] = None
43+
self._front = (self._front + 1) % len(self._data)
44+
self._size -= 1
45+
return answer
46+
47+
def enqueue(self, e):
48+
"""Add an element to back of queue."""
49+
if self._size == len(self._data):
50+
self._resize(2 * len(self._data))
51+
avail = (self._size + self._front) % len(self._data)
52+
self._data[avail] = e
53+
self._size += 1
54+
55+
def _resize(self, cap):
56+
"""Resize to a new list of capacity >= len(self)"""
57+
old = self._data
58+
self._data = [None]*cap
59+
walk = self._front
60+
for k in range(self._size):
61+
self._data[k] = old[walk]
62+
walk = (1 + walk) % len(old)
63+
self._front = 0
64+
65+
def __str__(self):
66+
"""Return the Queue"""
67+
result = ''.join(str(self._data[i]) + " " for i in range(len(self._data)) if self._data[i] is not None)
68+
return result
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
class Empty(Exception):
2+
"""Error attempting to access an element from an empty container"""
3+
pass
4+
5+
class ArrayStack:
6+
"""LIFO Stack implementation using a Python list as underlying storage."""
7+
8+
def __init__(self):
9+
"""Create an empty stack."""
10+
self._data = []
11+
12+
def __len__(self):
13+
"""Return the number of elements in the stack."""
14+
return len(self._data)
15+
16+
def is_empty(self):
17+
"""Return True if stack is empty."""
18+
return len(self._data) == 0
19+
20+
def push(self,e):
21+
"""Add element e to the top of the stack."""
22+
self._data.append(e)
23+
24+
def top(self):
25+
"""Return the element at the top of the stack.
26+
27+
Raise empty exception if the stack is empty.
28+
"""
29+
if self.is_empty():
30+
raise Empty('Stack is empty.')
31+
return self._data[-1]
32+
33+
def pop(self):
34+
"""Remove and return the element from the top of the Stack.
35+
36+
Raise empty exception if the stack is empty.
37+
"""
38+
if self.is_empty():
39+
raise Empty('Stack is empty.')
40+
return self._data.pop()
41+
42+
def __str__(self):
43+
"""Prints the elements of stack"""
44+
result = ''.join(str(self._data[i]) + " " for i in range(len(self._data)))
45+
return result
46+
47+
48+
49+
# Testing
50+
if __name__ == "__main__":
51+
S = ArrayStack()
52+
S.push(5)
53+
S.push(3)
54+
print(len(S))
55+
print(S.pop())
56+
print(S.is_empty())
57+
print(S.pop())
58+
print(S.is_empty())
59+
S.push(7)
60+
S.push(9)
61+
print(S.top())
62+
S.push(4)
63+
print(len(S))
64+
print(S.pop())
65+
S.push(6)

0 commit comments

Comments
 (0)