mirror of
https://github.com/autistic-symposium/master-algorithms-py.git
synced 2025-04-30 04:36:08 -04:00
fix few details, stacks
This commit is contained in:
parent
578a4f28da
commit
415e9c02e2
Binary file not shown.
@ -1,3 +1,10 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
__author__ = "Mari Wahl"
|
||||||
|
__email__ = "marina.w4hl@gmail.com"
|
||||||
|
|
||||||
|
""" A class for an animal shelter"""
|
||||||
|
|
||||||
class Node(object):
|
class Node(object):
|
||||||
def __init__(self, name, which):
|
def __init__(self, name, which):
|
||||||
self.name = name
|
self.name = name
|
@ -19,7 +19,7 @@ class LinkedQueue(object):
|
|||||||
|
|
||||||
|
|
||||||
def isEmpty(self):
|
def isEmpty(self):
|
||||||
return bool(self.head)
|
return not bool(self.head)
|
||||||
|
|
||||||
|
|
||||||
def dequeue(self):
|
def dequeue(self):
|
||||||
|
@ -10,7 +10,7 @@ class Queue(object):
|
|||||||
self.items = []
|
self.items = []
|
||||||
|
|
||||||
def isEmpty(self):
|
def isEmpty(self):
|
||||||
return bool(self.items)
|
return not bool(self.items)
|
||||||
|
|
||||||
def enqueue(self, item):
|
def enqueue(self, item):
|
||||||
self.items.insert(0, item)
|
self.items.insert(0, item)
|
||||||
|
@ -54,7 +54,7 @@ class Queue(object):
|
|||||||
return "Queue empty!"
|
return "Queue empty!"
|
||||||
|
|
||||||
def isEmpty(self):
|
def isEmpty(self):
|
||||||
return not (bool(self.in_stack) or bool(self.out_stack))
|
return not ((bool(self.in_stack) or bool(self.out_stack)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,40 +1,42 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python
|
||||||
# mari von steinkirch @2013
|
|
||||||
# steinkirch at gmail
|
__author__ = "Mari Wahl"
|
||||||
|
__email__ = "marina.w4hl@gmail.com"
|
||||||
|
|
||||||
|
''' use a stack to balance the parenteses of a string '''
|
||||||
|
|
||||||
|
|
||||||
from stack import Stack
|
from stack import Stack
|
||||||
|
|
||||||
def balance_par_str_with_stack(symbolString):
|
def balance_par_str_with_stack(str1):
|
||||||
''' use a stack to balance the parenteses of a string '''
|
|
||||||
s = Stack()
|
s = Stack()
|
||||||
balanced = True
|
balanced = True
|
||||||
index = 0
|
index = 0
|
||||||
while index < len(symbolString) and balanced:
|
|
||||||
symbol = symbolString[index]
|
while index < len(str1) and balanced:
|
||||||
|
|
||||||
|
symbol = str1[index]
|
||||||
|
|
||||||
if symbol == "(":
|
if symbol == "(":
|
||||||
s.push(symbol)
|
s.push(symbol)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if s.isEmpty():
|
if s.isEmpty():
|
||||||
balanced = False
|
balanced = False
|
||||||
else:
|
else:
|
||||||
s.pop()
|
s.pop()
|
||||||
|
|
||||||
index = index + 1
|
index = index + 1
|
||||||
|
|
||||||
if balanced and s.isEmpty():
|
if balanced and s.isEmpty():
|
||||||
return True
|
return True
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
def test_balance_par_str_with_stack(module_name='this module'):
|
|
||||||
print(balance_par_str_with_stack('((()))'))
|
print(balance_par_str_with_stack('((()))'))
|
||||||
print(balance_par_str_with_stack('(()'))
|
print(balance_par_str_with_stack('(()'))
|
||||||
|
|
||||||
s = 'Tests in {name} have {con}!'
|
|
||||||
print(s.format(name=module_name, con='passed'))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
test_balance_par_str_with_stack()
|
|
||||||
|
@ -1,28 +1,30 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python
|
||||||
# mari von steinkirch @2013
|
|
||||||
# steinkirch at gmail
|
__author__ = "Mari Wahl"
|
||||||
|
__email__ = "marina.w4hl@gmail.com"
|
||||||
|
|
||||||
|
'''transform a decimal number to a binary number with a stack '''
|
||||||
|
|
||||||
|
|
||||||
from stack import Stack
|
from stack import Stack
|
||||||
|
|
||||||
def dec2bin_with_stack(decnum):
|
def dec2bin_with_stack(decnum):
|
||||||
'''transform a decimal number to a binary number with a stack '''
|
|
||||||
s = Stack()
|
s = Stack()
|
||||||
str_aux = ''
|
str_aux = ''
|
||||||
|
|
||||||
while decnum > 0:
|
while decnum > 0:
|
||||||
dig = decnum % 2
|
dig = decnum % 2
|
||||||
decnum = decnum//2
|
decnum = decnum//2
|
||||||
s.push(dig)
|
s.push(dig)
|
||||||
|
|
||||||
while not s.isEmpty():
|
while not s.isEmpty():
|
||||||
str_aux += str(s.pop())
|
str_aux += str(s.pop())
|
||||||
|
|
||||||
return str_aux
|
return str_aux
|
||||||
|
|
||||||
|
|
||||||
def test_dec2bin_with_stack(module_name='this module'):
|
|
||||||
decnum = 9
|
|
||||||
assert(dec2bin_with_stack(decnum) == '1001')
|
|
||||||
s = 'Tests in {name} have {con}!'
|
|
||||||
print(s.format(name=module_name, con='passed'))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
test_dec2bin_with_stack()
|
decnum = 9
|
||||||
|
assert(dec2bin_with_stack(decnum) == '1001')
|
||||||
|
@ -1,52 +1,73 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python
|
||||||
# mari von steinkirch @2013
|
|
||||||
# steinkirch at gmail
|
|
||||||
|
|
||||||
class Node:
|
__author__ = "Mari Wahl"
|
||||||
def __init__(self, value=None):
|
__email__ = "marina.w4hl@gmail.com"
|
||||||
|
|
||||||
|
|
||||||
|
""" A stack made of linked list"""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Node(object):
|
||||||
|
def __init__(self, value=None, pointer=None):
|
||||||
self.value = value
|
self.value = value
|
||||||
self.next = None
|
self.pointer = pointer
|
||||||
|
|
||||||
class StackwithNodes:
|
|
||||||
''' Define a Stack with nodes'''
|
class Stack(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.top = None
|
self.head = None
|
||||||
|
|
||||||
def isEmpty(self):
|
def isEmpty(self):
|
||||||
return bool(self.top)
|
return not bool(self.head)
|
||||||
|
|
||||||
|
def push(self, item):
|
||||||
|
self.head = Node(item, self.head)
|
||||||
|
|
||||||
|
|
||||||
def pop(self):
|
def pop(self):
|
||||||
node = self.top
|
if self.head:
|
||||||
self.top = node.next
|
node = self.head
|
||||||
|
self.head = node.pointer
|
||||||
return node.value
|
return node.value
|
||||||
|
else:
|
||||||
|
print('Stack is empty.')
|
||||||
|
|
||||||
def push(self, value):
|
|
||||||
node = Node(value)
|
|
||||||
node.next = self.top
|
|
||||||
self.top = node
|
|
||||||
|
|
||||||
def size(self):
|
|
||||||
node = self.top
|
|
||||||
if node not None: num_nodes = 1
|
|
||||||
else: return 0
|
|
||||||
while node.next:
|
|
||||||
num_nodes += 1
|
|
||||||
node = node.next
|
|
||||||
return num_nodes
|
|
||||||
|
|
||||||
def peek(self):
|
def peek(self):
|
||||||
return self.top.value
|
if self.head:
|
||||||
|
return self.head.value
|
||||||
|
else:
|
||||||
|
print('Stack is empty.')
|
||||||
|
|
||||||
|
|
||||||
|
def size(self):
|
||||||
|
node = self.head
|
||||||
|
count = 0
|
||||||
|
while node:
|
||||||
|
count +=1
|
||||||
|
node = node.pointer
|
||||||
|
return count
|
||||||
|
|
||||||
|
|
||||||
|
def _printList(self):
|
||||||
|
node = self.head
|
||||||
|
while node:
|
||||||
|
print(node.value)
|
||||||
|
node = node.pointer
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
stack = StackwithNodes()
|
|
||||||
stack.push(1)
|
|
||||||
stack.push(2)
|
|
||||||
stack.push(3)
|
|
||||||
print(stack.size())
|
|
||||||
print(stack.peek())
|
|
||||||
print(stack.pop())
|
|
||||||
print(stack.peek())
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
stack = Stack()
|
||||||
|
print("Is the stack empty? ", stack.isEmpty())
|
||||||
|
print("Adding 0 to 10 in the stack...")
|
||||||
|
for i in range(10):
|
||||||
|
stack.push(i)
|
||||||
|
stack._printList()
|
||||||
|
print("Stack size: ", stack.size())
|
||||||
|
print("Stack peek : ", stack.peek())
|
||||||
|
print("Pop...", stack.pop())
|
||||||
|
print("Stack peek: ", stack.peek())
|
||||||
|
print("Is the stack empty? ", stack.isEmpty())
|
||||||
|
stack._printList()
|
||||||
|
@ -1,30 +1,31 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python
|
||||||
# mari von steinkirch @2013
|
|
||||||
# steinkirch at gmail
|
|
||||||
|
|
||||||
import sys
|
__author__ = "Mari Wahl"
|
||||||
import stack
|
__email__ = "marina.w4hl@gmail.com"
|
||||||
|
|
||||||
|
''' Uses a stack to reverse a string '''
|
||||||
|
|
||||||
|
from stack import Stack
|
||||||
|
|
||||||
def reverse_string_with_stack(str1):
|
def reverse_string_with_stack(str1):
|
||||||
''' Uses a stack to reverse a string '''
|
|
||||||
s = stack.Stack()
|
s = Stack()
|
||||||
revStr = ''
|
revStr = ''
|
||||||
|
|
||||||
for c in str1:
|
for c in str1:
|
||||||
s.push(c)
|
s.push(c)
|
||||||
|
|
||||||
while not s.isEmpty():
|
while not s.isEmpty():
|
||||||
revStr += s.pop()
|
revStr += s.pop()
|
||||||
|
|
||||||
return revStr
|
return revStr
|
||||||
|
|
||||||
|
|
||||||
def test_reverse_string_with_stack():
|
|
||||||
str1 = 'Buffy is a Slayer!'
|
|
||||||
assert(reverse_string_with_stack(str1) == '!reyalS a si yffuB')
|
|
||||||
print('Tests passed!')
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
test_reverse_string_with_stack()
|
str1 = 'Buffy is a Slayer!'
|
||||||
|
print(str1)
|
||||||
|
print(reverse_string_with_stack(str1))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,47 +1,57 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python
|
||||||
# mari von steinkirch @2013
|
|
||||||
# steinkirch at gmail
|
|
||||||
|
|
||||||
class SetOfStacks(list):
|
__author__ = "Mari Wahl"
|
||||||
|
__email__ = "marina.w4hl@gmail.com"
|
||||||
|
|
||||||
|
""" define a class for a set of stacks """
|
||||||
|
|
||||||
|
from stack import Stack
|
||||||
|
|
||||||
|
class SetOfStacks(Stack):
|
||||||
def __init__(self, capacity=4):
|
def __init__(self, capacity=4):
|
||||||
self.stacks = []
|
self.setofstacks = []
|
||||||
self.last_stack = []
|
self.items = []
|
||||||
self.capacity = capacity
|
self.capacity = capacity
|
||||||
self.stacks.append(self.last_stack)
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return str(self.stacks)
|
|
||||||
|
|
||||||
def push(self, value):
|
def push(self, value):
|
||||||
last_stack = self.last_stack
|
if self.size() >= self.capacity:
|
||||||
if len(last_stack) is self.capacity:
|
self.setofstacks.append(self.items)
|
||||||
last_stack = []
|
self.items = []
|
||||||
self.last_stack = last_stack
|
self.items.append(value)
|
||||||
self.stacks.append(last_stack)
|
|
||||||
last_stack.append(value)
|
|
||||||
|
|
||||||
def pop(self):
|
def pop(self):
|
||||||
last_stack = self.last_stack
|
value = self.items.pop()
|
||||||
value = last_stack.pop()
|
if self.isEmpty() and self.setofstacks:
|
||||||
if len(last_stack) is 0:
|
self.items = self.setofstacks.pop()
|
||||||
self.stacks.pop()
|
|
||||||
self.last_stack = self.stacks[-1]
|
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def sizeStack(self):
|
||||||
stack = SetOfStacks()
|
return len(self.setofstacks)*self.capacity + self.size()
|
||||||
stack.push(1)
|
|
||||||
stack.push(2)
|
|
||||||
stack.push(3)
|
def __repr__(self):
|
||||||
stack.push(4)
|
aux = []
|
||||||
stack.push(5)
|
for s in self.setofstacks:
|
||||||
stack.push(6)
|
aux.extend(s)
|
||||||
print(stack)
|
aux.extend(self.items)
|
||||||
stack.pop()
|
return '{}'.format(aux)
|
||||||
stack.pop()
|
|
||||||
stack.pop()
|
|
||||||
print(stack)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
capacity = 5
|
||||||
|
stack = SetOfStacks(capacity)
|
||||||
|
print("Is the stack empty? ", stack.isEmpty())
|
||||||
|
print("Adding 0 to 10 in the stack...")
|
||||||
|
for i in range(10):
|
||||||
|
stack.push(i)
|
||||||
|
print(stack)
|
||||||
|
print("Stack size: ", stack.sizeStack())
|
||||||
|
print("Stack peek : ", stack.peek())
|
||||||
|
print("Pop...", stack.pop())
|
||||||
|
print("Stack peek: ", stack.peek())
|
||||||
|
print("Is the stack empty? ", stack.isEmpty())
|
||||||
|
print(stack)
|
||||||
|
@ -1,165 +0,0 @@
|
|||||||
from stack import Stack, Node
|
|
||||||
|
|
||||||
class SetOfStacks(object):
|
|
||||||
def __init__(self, capacity):
|
|
||||||
assert(capacity > 1)
|
|
||||||
self.capacity = capacity
|
|
||||||
self.stack_now = None
|
|
||||||
self.stack_now_size = 0
|
|
||||||
self.old_stacks = []
|
|
||||||
|
|
||||||
|
|
||||||
def _checkIfFull(self):
|
|
||||||
return self.stack_now_size == self.capacity
|
|
||||||
|
|
||||||
|
|
||||||
def _addStack(self):
|
|
||||||
self.stack_now = Stack()
|
|
||||||
self.stack_now_size = 0
|
|
||||||
|
|
||||||
|
|
||||||
def _archiveStack(self):
|
|
||||||
self.old_stacks.append(self.stack_now)
|
|
||||||
self.stack_now = None
|
|
||||||
self.stack_now_size = 0
|
|
||||||
|
|
||||||
|
|
||||||
def _popItem(self):
|
|
||||||
if self.stack_now.top:
|
|
||||||
value = self.stack_now.top.value
|
|
||||||
if self.stack_now.top.next:
|
|
||||||
node = self.stack_now.top
|
|
||||||
self.stack_now.top = self.stack_now.top.next
|
|
||||||
else:
|
|
||||||
self.stack_now = []
|
|
||||||
return value
|
|
||||||
raise Exception('Stack is empty.')
|
|
||||||
|
|
||||||
|
|
||||||
def numberOfStacksUsed(self):
|
|
||||||
if self.stack_now:
|
|
||||||
return len(self.old_stacks) + 1
|
|
||||||
else:
|
|
||||||
return len(self.old_stacks)
|
|
||||||
|
|
||||||
|
|
||||||
def seeTop(self):
|
|
||||||
if self.stack_now:
|
|
||||||
return self.stack_now.top.value
|
|
||||||
elif self.old_stacks:
|
|
||||||
return self.old_stacks[-1].top.value
|
|
||||||
raise Exception('Stack is Empty')
|
|
||||||
|
|
||||||
|
|
||||||
def isEmpty(self):
|
|
||||||
return not (bool(self.stack_now) or bool(self.old_stacks))
|
|
||||||
|
|
||||||
|
|
||||||
def _sizeStackInUse(self):
|
|
||||||
return self.stack_now_size
|
|
||||||
|
|
||||||
|
|
||||||
def size(self):
|
|
||||||
return self._sizeStackInUse() + self.capacity*len(self.old_stacks)
|
|
||||||
|
|
||||||
|
|
||||||
def push(self, item):
|
|
||||||
if not self.stack_now:
|
|
||||||
self._addStack()
|
|
||||||
|
|
||||||
node = Node(item)
|
|
||||||
node.next = self.stack_now.top
|
|
||||||
self.stack_now.top = node
|
|
||||||
|
|
||||||
self.stack_now_size += 1
|
|
||||||
|
|
||||||
if self._checkIfFull():
|
|
||||||
self._archiveStack()
|
|
||||||
|
|
||||||
|
|
||||||
def pop(self):
|
|
||||||
if not self.stack_now:
|
|
||||||
if not self.old_stacks:
|
|
||||||
raise Exception('Stack is empty')
|
|
||||||
else:
|
|
||||||
self.stack_now = self.old_stacks.pop()
|
|
||||||
self.stack_now_size = self.capacity - 1
|
|
||||||
self._popItem()
|
|
||||||
else:
|
|
||||||
self._popItem()
|
|
||||||
if self.stack_now:
|
|
||||||
self.stack_now_size -= 1
|
|
||||||
else:
|
|
||||||
self.stack_now_size = 0
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
s1 = SetOfStacks(3)
|
|
||||||
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.push(1)
|
|
||||||
print('Push item 1')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.push(2)
|
|
||||||
s1.push(3)
|
|
||||||
print('Push item 2 and 3')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.push(4)
|
|
||||||
print('Push item 4')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.push(5)
|
|
||||||
print('Push item 5')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.pop()
|
|
||||||
print('Pop item 5')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.pop()
|
|
||||||
print('Pop item 4')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.pop()
|
|
||||||
s1.pop()
|
|
||||||
print('Pop item 3 e 2')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.pop()
|
|
||||||
print('Pop item 1')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,154 +0,0 @@
|
|||||||
from stack import StackList
|
|
||||||
|
|
||||||
class SetOfStacksList(object):
|
|
||||||
def __init__(self, capacity):
|
|
||||||
assert(capacity > 1)
|
|
||||||
self.capacity = capacity
|
|
||||||
self.stack_now = []
|
|
||||||
self.old_stacks = []
|
|
||||||
|
|
||||||
def _checkIfFull(self):
|
|
||||||
return len(self.stack_now) == self.capacity
|
|
||||||
|
|
||||||
|
|
||||||
def _archiveStack(self):
|
|
||||||
self.old_stacks.append(self.stack_now)
|
|
||||||
self.stack_now = []
|
|
||||||
|
|
||||||
|
|
||||||
def _popItem(self):
|
|
||||||
if self.stack_now:
|
|
||||||
return self.stack_now.pop()
|
|
||||||
raise Exception('Stack is empty.')
|
|
||||||
|
|
||||||
|
|
||||||
def _sizeStackInUse(self):
|
|
||||||
return len(self.stack_now)
|
|
||||||
|
|
||||||
|
|
||||||
def numberOfStacksUsed(self):
|
|
||||||
if self.stack_now:
|
|
||||||
return len(self.old_stacks) + 1
|
|
||||||
else:
|
|
||||||
return len(self.old_stacks)
|
|
||||||
|
|
||||||
|
|
||||||
def seeTop(self):
|
|
||||||
if self.stack_now:
|
|
||||||
return self.stack_now[-1]
|
|
||||||
elif self.old_stacks:
|
|
||||||
return self.old_stacks[-1][-1]
|
|
||||||
raise Exception('Stack is Empty')
|
|
||||||
|
|
||||||
|
|
||||||
def isEmpty(self):
|
|
||||||
return not(bool(self.stack_now) or bool(self.old_stacks))
|
|
||||||
|
|
||||||
|
|
||||||
def size(self):
|
|
||||||
return len(self.stack_now) + self.capacity*len(self.old_stacks)
|
|
||||||
|
|
||||||
|
|
||||||
def push(self, item):
|
|
||||||
self.stack_now.append(item)
|
|
||||||
if self._checkIfFull():
|
|
||||||
self._archiveStack()
|
|
||||||
|
|
||||||
|
|
||||||
def pop(self):
|
|
||||||
if not self.stack_now:
|
|
||||||
if not self.old_stacks:
|
|
||||||
raise Exception('Stack is empty')
|
|
||||||
else:
|
|
||||||
self.stack_now = self.old_stacks.pop()
|
|
||||||
return self.stack_now.pop()
|
|
||||||
|
|
||||||
def popAt(self, index):
|
|
||||||
number_of_stacks = self.size()
|
|
||||||
if index < number_of_stacks:
|
|
||||||
if index == number_of_stacks - 1 and self.stack_now:
|
|
||||||
return self.stack_now.pop()
|
|
||||||
if index < number_of_stacks - 1:
|
|
||||||
stack_here = self.old_stacks[index]
|
|
||||||
return stack_here.pop()
|
|
||||||
raise Exception('Stack at index {} is empty.'.format(index))
|
|
||||||
raise Exception('Index larger than the number of stacks.')
|
|
||||||
|
|
||||||
def printStacks(self):
|
|
||||||
return str(self.old_stacks), str(self.stack_now)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
s1 = SetOfStacksList(3)
|
|
||||||
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.push(1)
|
|
||||||
print('Push item 1')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.push(2)
|
|
||||||
s1.push(3)
|
|
||||||
print('Push item 2 and 3')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.push(4)
|
|
||||||
print('Push item 4')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.push(5)
|
|
||||||
print('Push item 5')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.pop()
|
|
||||||
print('Pop item 5')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.pop()
|
|
||||||
print('Pop item 4')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.pop()
|
|
||||||
s1.pop()
|
|
||||||
print('Pop item 3 e 2')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.seeTop())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
s1.pop()
|
|
||||||
print('Pop item 1')
|
|
||||||
print(s1.numberOfStacksUsed())
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
|
|
||||||
|
|
||||||
s2 = SetOfStacksList(3)
|
|
||||||
for i in range(1, 11):
|
|
||||||
s2.push(i)
|
|
||||||
print(s2.printStacks())
|
|
||||||
print(s2.popAt(2))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,21 +0,0 @@
|
|||||||
def sortStack(s):
|
|
||||||
bufs = []
|
|
||||||
while s:
|
|
||||||
item = s.pop()
|
|
||||||
count, i = 0, 0
|
|
||||||
while bufs and bufs[-1] > item:
|
|
||||||
s.append(bufs.pop())
|
|
||||||
count += 1
|
|
||||||
bufs.append(item)
|
|
||||||
while i < count:
|
|
||||||
bufs.append(s.pop())
|
|
||||||
i += 1
|
|
||||||
return bufs
|
|
||||||
|
|
||||||
def main():
|
|
||||||
s = [3, 5, 1, 2, 6, 7, 8]
|
|
||||||
print(sortStack(s))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,40 +1,53 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python
|
||||||
# mari von steinkirch @2013
|
|
||||||
# steinkirch at gmail
|
__author__ = "Mari Wahl"
|
||||||
|
__email__ = "marina.w4hl@gmail.com"
|
||||||
|
|
||||||
|
|
||||||
|
''' define the stack class '''
|
||||||
|
|
||||||
|
|
||||||
class Stack(object):
|
class Stack(object):
|
||||||
''' define the stack class '''
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.items = []
|
self.items = []
|
||||||
|
|
||||||
def isEmpty(self):
|
def isEmpty(self):
|
||||||
return self.items == []
|
return not bool(self.items)
|
||||||
|
|
||||||
def push(self, items):
|
def push(self, value):
|
||||||
self.items.append(items)
|
self.items.append(value)
|
||||||
|
|
||||||
def pop(self):
|
def pop(self):
|
||||||
return self.items.pop()
|
value = self.items.pop()
|
||||||
|
if value:
|
||||||
def peek(self):
|
return value
|
||||||
return self.items[-1]
|
else:
|
||||||
|
print("Stack is empty.")
|
||||||
|
|
||||||
def size(self):
|
def size(self):
|
||||||
return len(self.items)
|
return len(self.items)
|
||||||
|
|
||||||
|
def peek(self):
|
||||||
|
if self.items:
|
||||||
|
return self.items[-1]
|
||||||
|
else:
|
||||||
|
print('Stack is empty.')
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return '{}'.format(self.items)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
stack = Stack()
|
|
||||||
stack.push(1)
|
|
||||||
stack.push(2)
|
|
||||||
stack.push(3)
|
|
||||||
print(stack.size())
|
|
||||||
print(stack.peek())
|
|
||||||
print(stack.pop())
|
|
||||||
print(stack.peek())
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
stack = Stack()
|
||||||
|
print("Is the stack empty? ", stack.isEmpty())
|
||||||
|
print("Adding 0 to 10 in the stack...")
|
||||||
|
for i in range(10):
|
||||||
|
stack.push(i)
|
||||||
|
print("Stack size: ", stack.size())
|
||||||
|
print("Stack peek : ", stack.peek())
|
||||||
|
print("Pop...", stack.pop())
|
||||||
|
print("Stack peek: ", stack.peek())
|
||||||
|
print("Is the stack empty? ", stack.isEmpty())
|
||||||
|
print(stack)
|
@ -1,107 +0,0 @@
|
|||||||
from stack import Stack, Node, StackList
|
|
||||||
|
|
||||||
|
|
||||||
class StackMinElen(Stack):
|
|
||||||
def __init__(self):
|
|
||||||
self.top = None
|
|
||||||
self.mins = []
|
|
||||||
|
|
||||||
def printMin(self):
|
|
||||||
if self.mins:
|
|
||||||
return self.mins[-1]
|
|
||||||
raise Exception('Stack is empty.')
|
|
||||||
|
|
||||||
|
|
||||||
def pop(self):
|
|
||||||
if self.top:
|
|
||||||
self.mins.pop()
|
|
||||||
node = self.top
|
|
||||||
self.top = node.next
|
|
||||||
return node.value
|
|
||||||
raise Exception('Stack is empty.')
|
|
||||||
|
|
||||||
|
|
||||||
def push(self, item):
|
|
||||||
if self.top:
|
|
||||||
min_so_far = self.mins[-1]
|
|
||||||
if min_so_far > item:
|
|
||||||
self.mins.append(item)
|
|
||||||
else:
|
|
||||||
self.mins.append(min_so_far)
|
|
||||||
else:
|
|
||||||
self.mins.append(item)
|
|
||||||
node = Node(item)
|
|
||||||
node.next = self.top
|
|
||||||
self.top = node
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class StackListMinElen(StackList):
|
|
||||||
def __init__(self):
|
|
||||||
self.items = []
|
|
||||||
self.mins = []
|
|
||||||
|
|
||||||
def printMin(self):
|
|
||||||
if self.mins:
|
|
||||||
return self.mins[-1]
|
|
||||||
raise Exception('Stack is Empty')
|
|
||||||
|
|
||||||
def push(self, item):
|
|
||||||
self.items.append(item)
|
|
||||||
if self.mins:
|
|
||||||
if self.mins[-1] > item:
|
|
||||||
self.mins.append(item)
|
|
||||||
else:
|
|
||||||
self.mins.append(self.mins[-1])
|
|
||||||
else:
|
|
||||||
self.mins.append(item)
|
|
||||||
|
|
||||||
def pop(self):
|
|
||||||
if self.items:
|
|
||||||
self.mins.pop()
|
|
||||||
return self.items.pop()
|
|
||||||
raise Exception('Stack is Empty')
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
s1 = StackListMinElen()
|
|
||||||
l1 = [4, 2, 6, 3, 1, 5]
|
|
||||||
for i in l1:
|
|
||||||
s1.push(i)
|
|
||||||
print('Min: ', s1.printMin())
|
|
||||||
print('Pop: ', s1.pop())
|
|
||||||
print('Min: ', s1.printMin())
|
|
||||||
print('Pop: ', s1.pop())
|
|
||||||
print('Min: ', s1.printMin())
|
|
||||||
print('Pop: ', s1.pop())
|
|
||||||
print('Min: ', s1.printMin())
|
|
||||||
print('Pop: ', s1.pop())
|
|
||||||
print('Min: ', s1.printMin())
|
|
||||||
print('Pop: ', s1.pop())
|
|
||||||
print('Min: ', s1.printMin())
|
|
||||||
|
|
||||||
|
|
||||||
s2 = StackMinElen()
|
|
||||||
l1 = [4, 2, 6, 3, 1, 5]
|
|
||||||
for i in l1:
|
|
||||||
s2.push(i)
|
|
||||||
print('Min: ', s2.printMin())
|
|
||||||
print('Pop: ', s2.pop())
|
|
||||||
print('Min: ', s2.printMin())
|
|
||||||
print('Pop: ', s2.pop())
|
|
||||||
print('Min: ', s2.printMin())
|
|
||||||
print('Pop: ', s2.pop())
|
|
||||||
print('Min: ', s2.printMin())
|
|
||||||
print('Pop: ', s2.pop())
|
|
||||||
print('Min: ', s2.printMin())
|
|
||||||
print('Pop: ', s2.pop())
|
|
||||||
print('Min: ', s2.printMin())
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,94 +0,0 @@
|
|||||||
#!/usr/bin/python3
|
|
||||||
# steinkirch at gmail.com
|
|
||||||
# astro.sunysb.edu/steinkirch
|
|
||||||
|
|
||||||
class Node(object):
|
|
||||||
def __init__(self, value=None):
|
|
||||||
self.value = value
|
|
||||||
self.next = None
|
|
||||||
|
|
||||||
|
|
||||||
class Stack(object):
|
|
||||||
def __init__(self):
|
|
||||||
self.top = None
|
|
||||||
|
|
||||||
def push(self, item):
|
|
||||||
node = Node(item)
|
|
||||||
node.next = self.top
|
|
||||||
self.top = node
|
|
||||||
|
|
||||||
def pop(self):
|
|
||||||
if self.top:
|
|
||||||
node = self.top
|
|
||||||
self.top = node.next
|
|
||||||
return node.value
|
|
||||||
raise Exception('Stack is empty.')
|
|
||||||
|
|
||||||
def isEmpty(self):
|
|
||||||
return bool(self.top)
|
|
||||||
|
|
||||||
def seeTop(self):
|
|
||||||
if self.top:
|
|
||||||
return self.top.value
|
|
||||||
raise Exception('Stack is empty.')
|
|
||||||
|
|
||||||
def size(self):
|
|
||||||
node = self.top
|
|
||||||
count = 0
|
|
||||||
while node:
|
|
||||||
count +=1
|
|
||||||
node = node.next
|
|
||||||
return count
|
|
||||||
|
|
||||||
|
|
||||||
class StackList(list):
|
|
||||||
def __init__(self):
|
|
||||||
self.items = []
|
|
||||||
|
|
||||||
def push(self, item):
|
|
||||||
self.items.append(item)
|
|
||||||
|
|
||||||
def pop(self):
|
|
||||||
if self.items:
|
|
||||||
return self.items.pop()
|
|
||||||
raise Exception('Stack is empty.')
|
|
||||||
|
|
||||||
def seeTop(self):
|
|
||||||
if self.items:
|
|
||||||
return self.items[-1]
|
|
||||||
raise Exception('Stack is empty.')
|
|
||||||
|
|
||||||
def size(self):
|
|
||||||
return len(self.items)
|
|
||||||
|
|
||||||
def isEmpty(self):
|
|
||||||
return bool(self.items)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
s1 = StackList()
|
|
||||||
print(s1.isEmpty())
|
|
||||||
for i in range(1, 10):
|
|
||||||
s1.push(i)
|
|
||||||
print(s1.isEmpty())
|
|
||||||
print(s1.size())
|
|
||||||
print(s1.seeTop())
|
|
||||||
s1.pop()
|
|
||||||
print(s1.size())
|
|
||||||
print(s1.seeTop())
|
|
||||||
|
|
||||||
|
|
||||||
s2 = Stack()
|
|
||||||
print(s2.isEmpty())
|
|
||||||
for i in range(1, 10):
|
|
||||||
s2.push(i)
|
|
||||||
print(s2.isEmpty())
|
|
||||||
print(s2.size())
|
|
||||||
print(s2.seeTop())
|
|
||||||
s2.pop()
|
|
||||||
print(s2.size())
|
|
||||||
print(s2.seeTop())
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,55 +1,78 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python
|
||||||
# mari von steinkirch @2013
|
|
||||||
# steinkirch at gmail
|
|
||||||
|
|
||||||
class Stack(list):
|
__author__ = "Mari Wahl"
|
||||||
def push(self, value):
|
__email__ = "marina.w4hl@gmail.com"
|
||||||
if len(self) > 0:
|
|
||||||
last = self[-1]
|
|
||||||
minimum = self._find_minimum(value, last)
|
|
||||||
else:
|
|
||||||
minimum = value
|
|
||||||
self.minimum = minimum
|
|
||||||
self.append(NodeWithMin(value, minimum))
|
|
||||||
|
|
||||||
def _find_minimum(self, value, last_value):
|
''' A stack with a minimum lookup '''
|
||||||
if value < last_value.minimum:
|
|
||||||
return value
|
|
||||||
return last_value.minimum
|
|
||||||
|
|
||||||
def min(self):
|
from stack import Stack
|
||||||
return self.minimum
|
|
||||||
|
|
||||||
|
|
||||||
class NodeWithMin(object):
|
class NodeWithMin(object):
|
||||||
def __init__(self, value, minimum):
|
def __init__(self, value=None, minimum=None):
|
||||||
self.value = value
|
self.value = value
|
||||||
self.minimum = minimum
|
self.minimum = minimum
|
||||||
|
|
||||||
|
|
||||||
|
class StackMin(Stack):
|
||||||
|
def __init__(self):
|
||||||
|
self.items = []
|
||||||
|
self.minimum = None
|
||||||
|
|
||||||
|
|
||||||
|
def push(self, value):
|
||||||
|
if self.isEmpty() or self.minimum > value:
|
||||||
|
self.minimum = value
|
||||||
|
self.items.append(NodeWithMin(value, self.minimum))
|
||||||
|
|
||||||
|
|
||||||
|
def peek(self):
|
||||||
|
return self.items[-1].value
|
||||||
|
|
||||||
|
|
||||||
|
def peekMinimum(self):
|
||||||
|
return self.items[-1].minimum
|
||||||
|
|
||||||
|
|
||||||
|
def pop(self):
|
||||||
|
item = self.items.pop()
|
||||||
|
if item:
|
||||||
|
if item.value == self.minimum:
|
||||||
|
self.minimum = self.peekMinimum()
|
||||||
|
return item.value
|
||||||
|
else:
|
||||||
|
print("Stack is empty.")
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return str(self.value)
|
aux = []
|
||||||
|
for i in self.items:
|
||||||
|
aux.append(i.value)
|
||||||
|
return '{}'.format(aux)
|
||||||
|
|
||||||
def min(self):
|
|
||||||
return self.minimum
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
stack = Stack()
|
|
||||||
stack.push(1)
|
|
||||||
stack.push(2)
|
|
||||||
stack.push(3)
|
|
||||||
node = stack.pop()
|
|
||||||
print(node.minimum)
|
|
||||||
stack.push(0)
|
|
||||||
stack.push(4)
|
|
||||||
node = stack.pop()
|
|
||||||
print(node.min())
|
|
||||||
print(stack.min())
|
|
||||||
print(stack)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
stack = StackMin()
|
||||||
|
print("Is the stack empty? ", stack.isEmpty())
|
||||||
|
print("Adding 0 to 10 in the stack...")
|
||||||
|
for i in range(10,3, -1):
|
||||||
|
stack.push(i)
|
||||||
|
print(stack)
|
||||||
|
|
||||||
|
print("Stack size: ", stack.size())
|
||||||
|
print("Stack peek and peekMinimum : ", stack.peek(), stack.peekMinimum())
|
||||||
|
print("Pop...", stack.pop())
|
||||||
|
print("Stack peek and peekMinimum : ", stack.peek(), stack.peekMinimum())
|
||||||
|
print("Is the stack empty? ", stack.isEmpty())
|
||||||
|
print(stack)
|
||||||
|
|
||||||
|
for i in range(5, 1, -1):
|
||||||
|
stack.push(i)
|
||||||
|
print(stack)
|
||||||
|
|
||||||
|
print("Stack size: ", stack.size())
|
||||||
|
print("Stack peek and peekMinimum : ", stack.peek(), stack.peekMinimum())
|
||||||
|
print("Pop...", stack.pop())
|
||||||
|
print("Stack peek and peekMinimum : ", stack.peek(), stack.peekMinimum())
|
||||||
|
print("Is the stack empty? ", stack.isEmpty())
|
||||||
|
print(stack)
|
||||||
|
@ -1,16 +1,28 @@
|
|||||||
from stack import Stack, Node
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
__author__ = "Mari Wahl"
|
||||||
|
__email__ = "marina.w4hl@gmail.com"
|
||||||
|
|
||||||
|
|
||||||
|
""" Implement the 'towers of hanoi'"""
|
||||||
|
|
||||||
|
from linked_stack import Stack, Node
|
||||||
|
|
||||||
|
|
||||||
def moveTop(s1, s3):
|
def moveTop(s1, s3):
|
||||||
|
|
||||||
s3.append(s1.pop())
|
s3.append(s1.pop())
|
||||||
|
|
||||||
|
|
||||||
def moveDisks(n, s1, s3, s2):
|
def moveDisks(n, s1, s3, s2):
|
||||||
|
|
||||||
if n < 1: return
|
if n < 1: return
|
||||||
moveDisks(n - 1, s1, s2, s3)
|
moveDisks(n - 1, s1, s2, s3)
|
||||||
moveTop(s1, s3)
|
moveTop(s1, s3)
|
||||||
moveDisks(n -1, s2, s3, s1)
|
moveDisks(n -1, s2, s3, s1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def towersOfHanoi(n):
|
def towersOfHanoi(n):
|
||||||
s1 = [x+1 for x in range(n)]
|
s1 = [x+1 for x in range(n)]
|
||||||
s2 = []
|
s2 = []
|
||||||
@ -20,7 +32,10 @@ def towersOfHanoi(n):
|
|||||||
moveDisks(n, s1, s3, s2)
|
moveDisks(n, s1, s3, s2)
|
||||||
|
|
||||||
print('The first stick is {0} and the third stick has {1}'.format(s1, s3))
|
print('The first stick is {0} and the third stick has {1}'.format(s1, s3))
|
||||||
|
|
||||||
return s3
|
return s3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
towersOfHanoi(6)
|
towersOfHanoi(6)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user