1 # encoding=utf-8
 2 
 3 
 4 class Stack:
 5     """
 6     相同元素的栈, 初始化需指定长度与元素类型
 7     """
 8     def __init__(self, size=25, _type=int):
 9         """
10         __size: the size of stack
11         __cur_size: the size of elements
12         :param size: init size of stack
13         :param _type:   the type of stack element
14         """
15         assert isinstance(size, int)
16         if not type(_type) == type.__class__:
17             "传递的是类实例"
18             _type = type(_type)
19         self.__type = _type
20         self.__value = []
21         self.__size = size
22         self.__cur_size = 0
23 
24     def __del__(self):
25         del self.__value
26 
27     def __str__(self):
28         return str(self.__value) + '\t\tStack for %s and size=%s' % (self.__type,self.__size)
29 
30     def push(self, value):
31         """
32         push an element to stack top
33         :param value: element
34         :return: None
35         """
36         assert isinstance(value, self.__type)
37         if self.__cur_size >= self.__size:
38             raise OverflowError('the stack if full')
39         self.__value.append(value)
40         self.__cur_size += 1
41 
42     def pop(self):
43         """
44         pop an element from stack top
45         :return: element in stack top
46         """
47         if not self.__cur_size:
48             raise IndexError('the stack is empty')
49         self.__cur_size -= 1
50         return self.__value.pop()
51 
52     def empty(self):
53         """
54         set the stack to empty
55         :return: None
56         """
57         del self.__value
58         self.__value = []
59         self.__size = 0
60 
61     @property
62     def is_empty(self):
63         """
64         stack == empty
65         :return: bool
66         """
67         return not self.__cur_size
68 
69     @property
70     def is_full(self):
71         """
72         stack == full
73         :return: bool
74         """
75         return self.__size == self.__cur_size
76 
77     def resize(self, size):
78         """
79         reset a size for stack
80         :param size: new size of stack
81         :return:  None
82         """
83         assert isinstance(size, int)
84         if size < self.__cur_size:
85             del self.__value[size: self.__cur_size]
86             self.__cur_size = size
87         self.__size = size
88 
89     @property
90     def remainder_size(self):
91         """
92         remainder_size of stack
93         :return: remainder_size of stack
94         """
95         return self.__size - self.__cur_size

实例化时类型可通过类名或实例传递, 如下:

  Stack(10, 1)
  Stack(10, int)