标签:算法与数据结构
#!/usr/bin/python 
# -*- coding: utf-8 -*-
'''
Created on 2015-1-28
@author: beyondzhou
@name: test_linkliststack.py
'''
def test_linkliststack():
    
    # import linkListStack
    from mystack import LinkListStack
    
    print '#Init a stack named smith using push'
    smith = LinkListStack()
    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_linkliststack()# Implementation of the Stack ADT using a singly linked list
class LinkListStack:
    # Creates an empty stack
    def __init__(self):
        self._top = None
        self._size = 0
    # Returns True if the stack is empty or False otherwise
    def isEmpty(self):
        return self._top is None
    # Returns the number of items in the stack
    def __len__(self):
        return self._size
    # 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._top.item
    # Removes and returns the top item on the stack
    def pop(self):
        assert not self.isEmpty(), "Cannot pop from an empty stack"
        node = self._top
        self._top = self._top.next
        self._size -= 1
        print 'pop item:', node.item
        return node.item
    # Pushes an item onto the top of the stack
    def push(self, item):
        self._top = _StackNode(item, self._top)
        self._size += 1
        
    def __iter__(self):
        return _LinkStackIterator(self._top)
# The private storage class for creating stack nodes
class _StackNode:
    def __init__(self, item, link):
        self.item = item
        self.next = link
        
# Implementation of linked list stack iter  
class _LinkStackIterator:  
    def __init__(self, listHead):  
        self._curNode = listHead  
  
    def __iter__(self):  
        return self  
  
    def next(self):  
        if self._curNode is None:  
            raise StopIteration  
        else:  
            item = self._curNode.item  
            self._curNode = self._curNode.next  
            return item  #Init a stack named smith using push #output smith stack ECON-101 HIST-340 MATH-121 CSCI-112 #pop one item pop item: ECON-101 #output smith stack after pop HIST-340 MATH-121 CSCI-112 #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 pop item: HIST-340 pop item: MATH-121 pop item: CSCI-112 #check wheter the stack is empty after pop all items stack is empty!
Python 使用单链表实现堆栈 (基于class, 包含迭代器)
标签:算法与数据结构
原文地址:http://blog.csdn.net/guaguastd/article/details/43230305