实现一个栈的数据结构,含有:压栈、弹栈、取栈顶元素、判断栈是否为空、获取栈的元素个数
栈在实际生活中,应用也很多:子弹夹的子弹,箱子里放书,叠起来的碗等
思路:
1、栈是一个后进先出的线性表结构,可以用列表来实现
2、可以根据题目写出接口:push, pop, get, is_empty, get_size
3、栈类的初始化,除了列表,我们还可以加一个top,用来指向栈顶元素,初始值为-1,表示空栈
代码
class Stack:
def __init__(self):
self.stack = []
self.top = -1
def push(self, value):
self.stack.append(value)
self.top += 1
return value
def pop(self):
if self.top == -1:
print("It is an empty stack")
return None
value = self.stack.pop()
self.top -= 1
return value
def get(self):
if self.top == -1:
return None
return self.stack[self.top]
def is_empty(self):
if self.top == -1:
return True
else:
return False
def get_size(self):
return self.top + 1
# 单元测试
import unittest
from DataStructureStackQueue.Stack import Stack
class StackTest(unittest.TestCase):
def setUp(self):
self.stack = Stack()
def test_push(self):
value = self.stack.push(10)
self.assertEqual(value, 10)
self.assertEqual(self.stack.top, 0)
def test_pop1(self):
self.stack.push(10)
value = self.stack.pop()
self.assertEqual(value, 10)
self.assertEqual(self.stack.top, -1)
def test_pop2(self):
value = self.stack.pop()
self.assertEqual(value, None)
def test_get1(self):
value = self.stack.get()
self.assertEqual(value, None)
def test_get2(self):
self.stack.push(10)
self.stack.push(20)
value = self.stack.get()
self.assertEqual(value, 20)
self.assertEqual(self.stack.top, 1)
def test_is_empty1(self):
result = self.stack.is_empty()
self.assertEqual(result, True)
def test_is_empty2(self):
self.stack.push(1)
result = self.stack.is_empty()
self.assertEqual(result, False)
def test_get_size1(self):
size = self.stack.get_size()
self.assertEqual(size, 0)
def test_get_size2(self):
self.stack.push(1)
self.stack.push(2)
self.stack.push(3)
size = self.stack.get_size()
self.assertEqual(size, 3)
if __name__ == "main":
unittest.main()