I am trying to implement a simple stack with Python using arrays. I was wondering if someone could let me know what\'s wrong with my code.
class myStack:
The proper implementation would include __iter__
also since Stack needs to be LIFO order.
class Stack:
def __init__(self):
self._a = []
def push(self, item):
self._a.append(item)
def pop(self):
return self._a.pop()
def isEmpty(self):
return len(self._a) == 0
def __iter__(self):
return reversed(self._a)
def __str__(self):
# return str(list(reversed(self._a)))
return str(list(iter(self)))
def main():
stack = Stack()
stack.push('a')
stack.push('b')
stack.push('c')
stack.pop()
print(stack)
if stack:
print("stack not empty")
stack.pop()
stack.pop()
if stack.isEmpty():
print("stack empty")
if __name__ == '__main__':
main()
Your stack is an array...
class stacked(): # Nodes in the stack
def __init__(self,obj,next):
self.obj = obj
self.next = next
def getObj(self):
return(self.obj)
def getNext(self):
return(self.next)
class stack(): # The stack itself
def __init__(self):
self.top=None
def push(self,obj):
self.top = stacked(obj,self.top)
def pop(self):
if(self.top == None):
return(None)
r = self.top.getObj()
self.top = self.top.getNext()
return(r)
I corrected a few problems below. Also, a 'stack', in abstract programming terms, is usually a collection where you add and remove from the top, but the way you implemented it, you're adding to the top and removing from the bottom, which makes it a queue.
class myStack:
def __init__(self):
self.container = [] # You don't want to assign [] to self - when you do that, you're just assigning to a new local variable called `self`. You want your stack to *have* a list, not *be* a list.
def isEmpty(self):
return self.size() == 0 # While there's nothing wrong with self.container == [], there is a builtin function for that purpose, so we may as well use it. And while we're at it, it's often nice to use your own internal functions, so behavior is more consistent.
def push(self, item):
self.container.append(item) # appending to the *container*, not the instance itself.
def pop(self):
return self.container.pop() # pop from the container, this was fixed from the old version which was wrong
def peek(self):
if self.isEmpty():
raise Exception("Stack empty!")
return self.container[-1] # View element at top of the stack
def size(self):
return len(self.container) # length of the container
def show(self):
return self.container # display the entire stack as list
s = myStack()
s.push('1')
s.push('2')
print(s.pop())
print(s.show())
Below is my implementation
class Stack:
def __init__(self):
self.items = list()
def is_empty(self):
return self.items == []
def peek(self):
if self.is_empty():
print('Cannot peek empty stack')
return
else:
return self.items[-1]
def pop(self):
if self.is_empty():
print('Cannot pop an empty stack')
return
else:
return self.items.pop()
def size(self):
return len(self.items)
def push(self,data):
self.items.append(data)
Below is the simple implementation of stack in python. In addition, it returns the middle element at any point in time.
class Stack:
def __init__(self):
self.arrList = []
def isEmpty(self):
if len(self.arrList):
return False
else:
return True
def push(self, val):
self.arrList.append(val)
def pop(self):
if not self.isEmpty():
self.arrList[len(self.arrList)-1]
self.arrList = self.arrList[:len(self.arrList)-1]
else:
print "Stack is empty"
def returnMiddle(self):
if not self.isEmpty():
mid = len(self.arrList)/2
return self.arrList[mid]
else:
print "Stack is empty"
def listStack(self):
print self.arrList
s = Stack()
s.push(5)
s.push(6)
s.listStack()
print s.returnMiddle()
s.pop()
s.listStack()
s.push(20)
s.push(45)
s.push(435)
s.push(35)
s.listStack()
print s.returnMiddle()
s.pop()
s.listStack()
Output:
[5, 6]
6
[5]
[5, 20, 45, 435, 35]
45
[5, 20, 45, 435]
Implementing a Stack in Python from the book of Problem Solving with Algorithms and Data Structures