首页 > 代码库 > Python 使用list实现堆栈 (基于class, 包含迭代器)

Python 使用list实现堆栈 (基于class, 包含迭代器)

#!/usr/bin/python 
# -*- coding: utf-8 -*-

'''
Created on 2015-1-27
@author: beyondzhou
@name: test_liststack.py
'''

def test_liststack():
    
    # import listStack
    from mystack import listStack
    
    print '#Init a stack named smith using push'
    smith = listStack()
    smith.push('CSCI-112')
    smith.push('MATH-121')
    smith.push('HIST-340')
    smith.push('ECON-101')
    
    print '\n#output smith stack'
    for element in smith:
        print element
           
    print '\n#pop one item'
    smith.pop()
    
    print '\n#output smith stack after pop'
    for element in smith:
        print element 
        
    print '\n#get the peek item'
    peek_item = smith.peek()
    print 'peek item is ', peek_item
    
    print '\n#get the length of stack'
    print 'the lenght of stack is ', len(smith)
    
    print '\n#check wheter the stack is empty'
    if smith.isEmpty():
        print 'stack is empty!'
    else:
        print 'stack is not empty!'
        
    print '\n#pop all items'
    while not smith.isEmpty():
        smith.pop()
    
    print '\n#check wheter the stack is empty after pop all items'
    if smith.isEmpty():
        print 'stack is empty!'
    else:
        print 'stack is not empty!'
    
if __name__ == "__main__":
    test_liststack()

# Implementation of iter
class _StackIterator:
    def __init__(self, theList):
        self._setItems = theList
        self._curItem = 0
    def __iter__(self):
        return self
    def next(self):
        if self._curItem < len(self._setItems):
            item = self._setItems[self._curItem]
            self._curItem += 1
            return item
        else:
            raise StopIteration
        
# Implementation of the Stack ADT using a Python list
class listStack:
    # Created an empty stack
    def __init__(self):
        self._theItems = list()

    # Returns True if the stack is empty or False otherwise
    def isEmpty(self):
        return len(self) == 0

    # Returns the number of items in the stack
    def __len__(self):
        return len(self._theItems)

    # Returns the top item on the stack without removing it
    def peek(self):
        assert not self.isEmpty(), "Cannot peek at an empty stack"
        return self._theItems[-1]

    # Removes and returns the top item on the stack
    def pop(self):
        assert not self.isEmpty(), "Cannot peek at an empty stack"
        return self._theItems.pop()

    # Push an item onto the top of the stack
    def push(self, item):
        self._theItems.append(item)
        
    # Returns an iterator for traversing the list of items
    def __iter__(self):
        return _StackIterator(self._theItems)

#Init a stack named smith using push

#output smith stack
CSCI-112
MATH-121
HIST-340
ECON-101

#pop one item

#output smith stack after pop
CSCI-112
MATH-121
HIST-340

#get the peek item
peek item is  HIST-340

#get the length of stack
the lenght of stack is  3

#check wheter the stack is empty
stack is not empty!

#pop all items

#check wheter the stack is empty after pop all items
stack is empty!

Python 使用list实现堆栈 (基于class, 包含迭代器)