昨天由于个人原因复习计划有些被打断,今天按计划开始学习 栈,队列和双端队列,链表。
一.栈
1.栈的操作
push(),pop(),top(),is_empty(),len()
2.简单的基于数组的栈实现
可以用list代替栈,但是有一些小区别(比如:列表可以增加或移除处于列表任意位置的元素),且append方法和push方法之间也有区别。我们应该如何改进?
适配器模式。
1.适配器设计模式可以有效修改一个现有的类。
2.方法:包含一个现有类的实例作为隐藏域,用隐藏实例变量的方法实现这个新类的方法的方式定义一个新类。
用python的列表实现一个栈:
(用适配器设置模式定义一个arraystack类,使用列表存储。同时,定义一个异常类处理栈空还取的情况)
class Empty(Exception):
pass
class arraystack:
def __init__(self):
self._data = []
def __len__(self):
return len(self._data)
def is_empty(self):
return len(self._data) == 0
def push(self, e):
self._data.append(e)
def top(self):
if self.is_empty():
raise Empty('stack is empty')
return self._data[-1]
def pop(self):
if self.is_empty():
raise Empty('stack is empty')
return self._data.pop()
代码中部分面向对象知识的解释1
3.栈的简单应用
1)栈实现数据的逆置
目标:实现文件中各行的逆置(即将第一行移到最后一行)
原理:栈先进后出
步骤:按照循序入栈,再逐个出栈
代码展示:
def reverse_file(filename):
s = Arraystack()
f = open(filename, 'r', encoding='utf-8')
for line in f:
s.push(line.rstrip('\n'))
f.close()
out = open(filename, 'w', encoding='utf-8')
while not s.is_empty():
out.write(s.pop() + '\n')
out.close()
reverse_file("sample.txt")
f0 = open('sample.txt', 'r', encoding='utf-8')
f1 = f0.read()
print(f1)
代码中部分面向对象知识的解释2
结果展示:
2)括号和HTML标记匹配
括号匹配
目标:判断算术表达式中分隔符是否成对
原理:栈的先进后出
步骤:扫描算术表达式的字符串,遇到各种左括号就入栈,遇到匹配的右括号,就将左括号出栈。最后,栈为空为成对,栈不为空为不成对。
代码展示:
def is_match(str):
left = '([{'
right = ')]}'
s = Arraystack()
for ch in str:
if ch in left:
s.push(ch)
elif ch in right:
if s.is_empty():
return False
if right.index(ch) != left.index(s.pop()):
# ch在right字符串中的位置和s.pop()在left字符串中的位置
# 判断当ch为右括号时,是否与栈顶元素匹配
return False
return s.is_empty()
代码中部分面向对象知识的解释3
结果展示:(测试用例"[(5+x)-(y+z)]")
HTML标记匹配
目标:判断HTML文本标签是否成对
原理:栈的先进后出
步骤:扫描原始字符串……开始标签被压入栈中,当其从栈中弹出时,即与解释标签进行匹配。
代码展示:
def ismatch_html(str1):
s = Arraystack()
j = str1.find('<')
while j != -1:
k = str1.find('<', j + 1)
if k == -1:
return False
tag = str1[j + 1:k]
if not tag.startswith('/'):
s.push(tag)
else:
if s.is_empty():
return False
if tag[1:] != s.pop():
return False
j = str1.find('<', k + 1)
return s.is_empty()
二、队列
1.队列的操作
enqueue()、dequeue()、first()、is_empty()、len()
2.基于数组的队列实现
男朋友生病了,下午睡太久了,梦华录太好看了,写不完了,明天再说
三、双端队列
四、链表
在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其是在类的定义中。
1 _xxx:保护成员,类对象和派生类对象可以访问这些成员,在类的外面一般不建议直接访问;
2 _ xxx _:系统定义的特殊成员;
3 _ _xxx:私有成员,以两个或更多下划线开头但不能以两个或更多下划线结束的成员,只有类自己能访问,子类对象不能直接访问到这个成员,但在类外部可以通过“对象名.类名 _xxx”这样的特殊方式来访问。
注意:Python中不存在严格意义上的私有成员。 ↩︎line.rstrip(‘\n’):删除string字符串末尾的指定字符,这里是换行符。 ↩︎
index() 函数用于从列表中找出某个值第一个匹配项的索引位置。 ↩︎