一:栈
1. 用数组实现一个顺序栈
class ArrayStack:
'''
顺序栈,栈顶指针指向的是栈顶元素
'''
def __init__(self, capacity=20): # 默认栈容量为20
self.capacity = capacity
self.data = [None] * self.capacity
self.top = -1
self.size = 0
def push(self, value):
'''
元素进栈
'''
if self.top == self.capacity - 1:
raise Exception('push failed: stack is full')
else:
self.top += 1
self.data[self.top] = value
self.size += 1
def pop(self):
'''
元素出栈,并返回该元素
'''
if self.top == -1:
raise Exception('pop failed: the stack is empty')
else:
elem = self.data[self.top]
self.top -= 1
self.size -= 1
return elem
def isEmpty(self):
'''判断栈是否为空'''
return self.top == -1
def isFull(self):
'''判断是否为满栈'''
return self.top == self.capacity - 1
2. 用链表实现一个链式栈
class ListNode:
def __init__(self, value, pnext=None):
self.data = value
self.next = pnext
class LinkedlistStack:
'''链栈'''
def __init__(self):
self.head = ListNode(None)
self.size = 0
def push(self, value):
'''元素入栈:前插结点'''
node = ListNode(value)
node.next = self.head.next
self.head.next = node
self.size += 1
def pop(self):
'''元素出栈并返回'''
if self.isEmpty():
raise Exception('pop failed: the stack is empty')
else:
p = self.head.next
self.head.next = p.next
self.size -= 1
return p
def isEmpty(self):
return self.size == 0
stack = LinkedlistStack()
stack.push(3)
stack.push(4)
stack.push(5)
stack.push(6)
q = stack.pop()
3.编程模拟实现一个浏览器的前进、后退功能
class ListNode:
'''链表结点'''
def __init__(self, value, pnext=None):
self.data = value
self.next = pnext
class LinkedlistStack:
'''链栈'''
def __init__(self):
self.head = ListNode(None)
self.size = 0
def push(self, value):
'''元素入栈:前插结点'''
node = ListNode(value)
node.next = self.head.next
self.head.next = node
self.size += 1
def pop(self):
'''元素出栈并返回'''
if self.isEmpty():
raise Exception('pop failed: the stack is empty')
else:
p = self.head.next
self.head.next = p.next
self.size -= 1
return p
def isEmpty(self):
if self.size == 0:
return True
else:
return False
class Simulation:
'''
模仿浏览器的前进后退
用两个链栈currentStack和helperStack来存储浏览的网页地址
currentStack的栈顶元素为当前浏览的网页地址
'''
def __init__(self, mainPage): # mainPage为浏览器主页网址
self.currentStack = LinkedlistStack()
self.helperStack = LinkedlistStack()
self.currentStack.push(mainPage)
def show(self):
'''显示当前网址的网页内容'''
website = self.currentStack.head.next.data
print('Showing the content of the current website:%s' % website)
def goNew(self, newWebsite):
''