Skip to content

Commit aed267e

Browse files
committed
finish ch7
1 parent 26d963d commit aed267e

19 files changed

+682
-2
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from stack import Stack
2+
3+
def reverse_string_with_stack(str1):
4+
s = Stack()
5+
revStr = ''
6+
7+
for c in str1:
8+
s.push(c)
9+
10+
while not s.isEmpty():
11+
revStr += s.pop()
12+
13+
return revStr
14+
15+
if __name__ == '__main__':
16+
str1 = '버피는 천사다.'
17+
print(str1)
18+
print(reverse_string_with_stack(str1))
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from stack import Stack
2+
3+
def balance_par_str_with_stack(str1):
4+
s = Stack()
5+
balanced = True
6+
index = 0
7+
8+
while index < len(str1) and balanced:
9+
symbol = str1[index]
10+
11+
if symbol == "(":
12+
s.push(symbol)
13+
14+
else:
15+
if s.isEmpty():
16+
balanced = False
17+
else:
18+
s.pop()
19+
20+
index = index + 1
21+
22+
if balanced and s.isEmpty():
23+
return True
24+
25+
else:
26+
return False
27+
28+
if __name__ == '__main__':
29+
print(balance_par_str_with_stack('((()))'))
30+
print(balance_par_str_with_stack('(()'))
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from stack import Stack
2+
3+
def dec2bin_with_stack(decnum):
4+
s = Stack()
5+
str_aux = ''
6+
7+
while decnum > 0:
8+
dig = decnum % 2
9+
decnum = decnum // 2
10+
s.push(dig)
11+
12+
while not s.isEmpty():
13+
str_aux += str(s.pop())
14+
15+
return str_aux
16+
17+
if __name__ == '__main__':
18+
decnum = 9
19+
print(dec2bin_with_stack(decnum))
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from stack import Stack
2+
3+
4+
class NodeWithMin(object):
5+
def __init__(self, value=None, minimum=None):
6+
self.value = value
7+
self.minimum = minimum
8+
9+
10+
class StackMin(Stack):
11+
def __init__(self):
12+
self.items = []
13+
self.minimum = None
14+
15+
def push(self, value):
16+
if self.isEmpty() or self.minimum > value:
17+
self.minimum = value
18+
self.items.append(NodeWithMin(value, self.minimum))
19+
20+
def peek(self):
21+
return self.items[-1].value
22+
23+
def peekMinimum(self):
24+
return self.items[-1].minimum
25+
26+
def pop(self):
27+
item = self.items.pop()
28+
if item:
29+
if item.value == self.minimum:
30+
self.minimum = self.peekMinimum()
31+
return item.value
32+
else:
33+
print("Stack is empty.")
34+
35+
def __repr__(self):
36+
aux = []
37+
for i in self.items:
38+
aux.append(i.value)
39+
return f"{aux}"
40+
41+
42+
if __name__ == '__main__':
43+
stack = StackMin()
44+
print(f"스택이 비었나요? {stack.isEmpty()}")
45+
print("스택에 숫자 10~1과 1~4를 추가합니다.")
46+
for i in range(10, 0, -1):
47+
stack.push(i)
48+
for i in range(1, 5):
49+
stack.push(i)
50+
print(stack)
51+
52+
print(f"스택 크기: {stack.size()}")
53+
print(f"peek: {stack.peek()}")
54+
print(f"peekMinimum: {stack.peekMinimum()}")
55+
print(f"pop: {stack.pop()}")
56+
print(f"peek: {stack.peek()}")
57+
print(f"peekMinimum: {stack.peekMinimum()}")
58+
print(f"스택이 비었나요? {stack.isEmpty()}")
59+
print(stack)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from stack import Stack
2+
3+
class SetOfStacks(Stack):
4+
def __init__(self, capacity=4):
5+
self.setofstacks = []
6+
self.items = []
7+
self.capacity = capacity
8+
9+
def push(self, value):
10+
if self.size() >= self.capacity:
11+
self.setofstacks.append(self.items)
12+
self.items = []
13+
self.items.append(value)
14+
15+
def pop(self):
16+
value = self.items.pop()
17+
if self.isEmpty() and self.setofstacks:
18+
self.items = self.setofstacks.pop()
19+
return value
20+
21+
def sizeStack(self):
22+
return len(self.setofstacks) * self.capacity + self.size()
23+
24+
def __repr__(self):
25+
aux = []
26+
for s in self.setofstacks:
27+
aux.extend(s)
28+
aux.extend(self.items)
29+
return f"{aux}"
30+
31+
if __name__ == '__main__':
32+
capacity = 5
33+
stack = SetOfStacks(capacity)
34+
print(f"스택이 비었나요? {stack.isEmpty()}")
35+
print("스택에 숫자 0~9를 추가합니다.")
36+
for i in range(10):
37+
stack.push(i)
38+
print(stack)
39+
print(f"스택 크기: {stack.sizeStack()}")
40+
print(f"peek: {stack.peek()}")
41+
print(f"pop: {stack.pop()}")
42+
print(f"peek: {stack.peek()}")
43+
print(f"스택이 비었나요? {stack.isEmpty()}")
44+
print(stack)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import string
2+
import collections
3+
4+
from deque import Deque
5+
6+
7+
STRIP = string.whitespace + string.punctuation + "\"'"
8+
9+
10+
def palindrome_checker_with_deque(str1):
11+
d1 = Deque()
12+
d2 = collections.deque()
13+
14+
for s in str1.lower():
15+
if s not in STRIP:
16+
d2.append(s)
17+
d1.enqueue(s)
18+
19+
eq1 = True
20+
while d1.size() > 1 and eq1:
21+
if d1.dequeue_front() != d1.dequeue():
22+
eq1 = False
23+
24+
eq2 = True
25+
while len(d2) > 1 and eq2:
26+
if d2.pop() != d2.popleft():
27+
eq2 = False
28+
29+
return eq1, eq2
30+
31+
if __name__ == '__main__':
32+
str1 = 'Madam Im Adam'
33+
str2 = 'Buffy is a Slayer'
34+
print(palindrome_checker_with_deque(str1))
35+
print(palindrome_checker_with_deque(str2))
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
class Node(object):
2+
def __init__(self, animalName=None, animalKind=None, pointer=None):
3+
self.animalName = animalName
4+
self.animalKind = animalKind
5+
self.pointer = pointer
6+
self.timestamp = 0
7+
8+
9+
class AnimalShelter(object):
10+
def __init__(self):
11+
self.headCat = None
12+
self.headDog = None
13+
self.tailCat = None
14+
self.tailDog = None
15+
self.animalNumber = 0
16+
17+
def enqueue(self, animalName, animalKind):
18+
self.animalNumber += 1
19+
newAnimal = Node(animalName, animalKind)
20+
newAnimal.timestamp = self.animalNumber
21+
22+
if animalKind == 'cat':
23+
if not self.headCat:
24+
self.headCat = newAnimal
25+
if self.tailCat:
26+
self.tailCat.pointer = newAnimal
27+
self.tailCat = newAnimal
28+
29+
elif animalKind == 'dog':
30+
if not self.headDog:
31+
self.headDog = newAnimal
32+
if self.tailDog:
33+
self.tailDog.pointer = newAnimal
34+
self.tailDog = newAnimal
35+
36+
def dequeueDog(self):
37+
if self.headDog:
38+
newAnimal = self.headDog
39+
self.headDog = newAnimal.pointer
40+
return str(newAnimal.animalName)
41+
else:
42+
print("개가 없습니다!")
43+
44+
def dequeueCat(self):
45+
if self.headCat:
46+
newAnimal = self.headCat
47+
self.headCat = newAnimal.pointer
48+
return str(newAnimal.animalName)
49+
else:
50+
print("고양이가 없습니다!")
51+
52+
def dequeueAny(self):
53+
if self.headCat and not self.headDog:
54+
return self.dequeueCat()
55+
elif self.headDog and not self.headCat:
56+
return self.dequeueDog()
57+
elif self.headDog and self.headCat:
58+
if self.headDog.timestamp < self.headCat.timestamp:
59+
return self.dequeueDog()
60+
else:
61+
return self.dequeueCat()
62+
else:
63+
print("동물이 없습니다.")
64+
65+
def _print(self):
66+
print("고양이:")
67+
cats = self.headCat
68+
while cats:
69+
print(f"\t{cats.animalName}")
70+
cats = cats.pointer
71+
print("개:")
72+
dogs = self.headDog
73+
while dogs:
74+
print(f"\t{dogs.animalName}")
75+
dogs = dogs.pointer
76+
77+
78+
if __name__ == '__main__':
79+
qs = AnimalShelter()
80+
qs.enqueue('밥', 'cat')
81+
qs.enqueue('미아', 'cat')
82+
qs.enqueue('요다', 'dog')
83+
qs.enqueue('울프', 'dog')
84+
qs._print()
85+
86+
print("하나의 개와 고양이에 대해서 dequeue를 실행합니다.")
87+
qs.dequeueDog()
88+
qs.dequeueCat()
89+
qs._print()

7장_추상_데이터_구조/1_stack.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def push(self, value):
1010

1111
def pop(self):
1212
value = self.items.pop()
13-
if value:
13+
if value is not None:
1414
return value
1515
else:
1616
print("Stack is empty.")
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import heapq
2+
3+
4+
def find_N_largest_items_seq(seq, N):
5+
return heapq.nlargest(N,seq)
6+
7+
def find_N_smallest_items_seq(seq, N):
8+
return heapq.nsmallest(N, seq)
9+
10+
def find_smallest_items_seq_heap(seq):
11+
heapq.heapify(seq)
12+
return heapq.heappop(seq)
13+
14+
def find_smallest_items_seq(seq):
15+
return min(seq)
16+
17+
def find_N_smallest_items_seq_sorted(seq, N):
18+
return sorted(seq)[:N]
19+
20+
def find_N_largest_items_seq_sorted(seq, N):
21+
return sorted(seq)[len(seq)-N:]
22+
23+
def test_find_N_largest_smallest_items_seq():
24+
seq = [1, 3, 2, 8, 6, 10, 9]
25+
N = 3
26+
assert(find_N_largest_items_seq(seq, N) == [10, 9, 8])
27+
assert(find_N_largest_items_seq_sorted(seq, N) == [8, 9, 10])
28+
assert(find_N_smallest_items_seq(seq, N) == [1,2,3])
29+
assert(find_N_smallest_items_seq_sorted(seq, N) == [1,2,3])
30+
assert(find_smallest_items_seq(seq) == 1)
31+
assert(find_smallest_items_seq_heap(seq) == 1)
32+
33+
print("테스트 통과!")
34+
35+
36+
if __name__ == '__main__':
37+
test_find_N_largest_smallest_items_seq()
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import heapq
2+
3+
4+
def merge_sorted_seqs(seq1, seq2):
5+
result = []
6+
for c in heapq.merge(seq1, seq2):
7+
result.append(c)
8+
return result
9+
10+
def test_merge_sorted_seqs():
11+
seq1 = [1, 2, 3, 8, 9, 10]
12+
seq2 = [2, 3, 4, 5, 6, 7, 9]
13+
seq3 = seq1 + seq2
14+
assert(merge_sorted_seqs(seq1, seq2) == sorted(seq3))
15+
16+
print("테스트 통과!")
17+
18+
19+
if __name__ == '__main__':
20+
test_merge_sorted_seqs()

0 commit comments

Comments
 (0)