在这片文章中,我们使用python3.8自制一个具有基本功能的栈结构,它的功能只有push,pop,peek这三个功能
` #!/usr/bin/env python
* coding: utf-8 *
@Time : 2024/9/15 19:26
@Author : Huzhaojun
@Version:V 1.0
@File : test.py
@desc :
# 数据结构复习第一章, 栈结构的实现与运用
class Node:
"""创建节点"""
def __init__(self, data=None):
self.data = data
self.next = None
class stack:
def __init__(self):
self._n = 0 # 记录元素个数
self.top = None # 这是一个永远指向栈顶的指针
self.next = None # 指向下一个元素
def push(self, data): # push 压入函数
node = Node(data) # 新建一个节点,并将其添加入栈中
if self.top: # 如果栈内有元素,就更新top指针的指向内容
node.next = self.top
self.top = node
else: # 否则直接指向新节点
self.top = node
self._n += 1
def pop(self): # pop 弹出函数
if self.top: # 判断栈顶是否存在元素,如果存在则执行下一步操作,否则直接返回None
data = self.top.data # 获取栈顶的值
self._n -= 1
if self.top.next: # 如果栈顶之下还存在其他元素,则替换指向指针的值
self.top = self.top.next
else: # 否则直接定义为None
self.top = None
return data
return None
def peek(self): # 查看栈顶值
if self.top:
return self.top.data
return None
`
使用过程:
x = stack()
x.push(1)
x.push(2)
print(x.peek())
print(x.pop())
print(x.peek())
输出结果:
2
2
1
实战一下
bracket-matching应用程序是一个常用的匹配括号的验证程序,验证包括(),{},【】符号是否平衡,及左右括号数量是否匹配,它还将确保一对括号确实包含在另一对括号中。
我们试着来验证一段xml文件,看看结果如何,注意,我在stack中新添了一个__len__函数:
`
#!/usr/bin/env python
* coding: utf-8 *
@Time : 2024/9/15 19:26
@Author : Huzhaojun
@Version:V 1.0
@File : test.py
@desc :
# 数据结构复习第一章, 栈结构的实现与运用
class Node:
"""创建节点"""
def __init__(self, data=None):
self.data = data
self.next = None
class stack:
def __init__(self):
self._n = 0 # 记录元素个数
self.top = None # 这是一个永远指向栈顶的指针
self.next = None # 指向下一个元素
def __len__(self): # 定义 len 事件
return self._n
def push(self, data): # push 压入函数
node = Node(data) # 新建一个节点,并将其添加入栈中
if self.top: # 如果栈内有元素,就更新top指针的指向内容
node.next = self.top
self.top = node
else: # 否则直接指向新节点
self.top = node
self._n += 1
def pop(self): # pop 弹出函数
if self.top: # 判断栈顶是否存在元素,如果存在则执行下一步操作,否则直接返回None
data = self.top.data # 获取栈顶的值
self._n -= 1
if self.top.next: # 如果栈顶之下还存在其他元素,则替换指向指针的值
self.top = self.top.next
else: # 否则直接定义为None
self.top = None
return data
return None
def peek(self): # 查看栈顶值
if self.top:
return self.top.data
return None
def check_brackets(statement):
Stack = stack()
for ch in statement:
if ch in "({[<":
Stack.push(ch)
if ch in ")}]>":
last = Stack.peek()
if last + ch in ("()", "[]", "{}", "<>"):
Stack.pop()
else:
return False
if len(Stack) > 0:
return False
return True
text = """
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindos</class>
<widget class="QDialog" name="MainWindos">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>402</width>
<height>575</height>
</rect>
</property>
<property name="windowTitle">
<string>music</string>
</property>
</widget>
<resources/>
<connections/>
</ui>"""
print(check_brackets(text))
`
运行结果:
True
自建的数据结构可以因需求而添加任意想要实现的方法,虽然内置的方法已经可以解决绝大部分问题了,但是在这过程中我们可以学习到更多。OVER