ARTS = Algorithm + Review + Tip + Share
Algorithm
这周复习以下常见的链表操作:
- 检验括号匹配
- 比较含退格的数字
下周复习常见的队列操作
#!/usr/bin/python3
# -*- encoding: utf-8 -*-
'''
@File : Algorithm.py
@Time : 2020/04/12 20:31:51
@Author : Boxt
@Version : 1.0
@Desc : common stack operations
@Desc_zh : 常见的栈操作
'''
'''
顺序栈,使用数组实现
'''
class SequenceStack:
def __init__(self, n: int):
if n <= 0:
raise "栈的大小不能小于1"
self.stackArr = [-1] * n # 栈
self.length = n # 栈的规定大小
self.top = -1 # 栈顶指针
# 入栈操作
def push(self, data) -> bool:
if self.top == self.length - 1:
return False
self.top += 1
self.stackArr[self.top] = data
return True
# 出栈操作
def pop(self) -> int:
if self.top < 0:
return None
data = self.stackArr[self.top]
self.top -= 1
return data
def isEmpty(self) -> bool:
if self.top < 0:
return True
else:
return False
def getTop(self) -> int:
if self.top < 0:
return None
return self.stackArr[self.top]
def getDataStr(self) -> str:
dataStr = ''
index = self.top + 1
while index:
index -= 1
dataStr += str(self.stackArr[index])
return dataStr
'''
链式栈,使用链表实现
'''
class Node:
def __init__(self, data: int, _next = None):
self.data: int = data
self.next: Node = _next
class LinkedStack:
def __init__(self, n: int):
if n <= 0:
raise "栈的大小不能小于1"
self.length = n # 栈的规定大小
self.count = 0 # 栈的实际长度
self.top = None # 栈顶指针
def push(self, data) -> bool:
if self.count == self.length:
return False
node = Node(data, self.top)
self.top = node
self.count += 1
return True
def pop(self) -> int:
if self.count == 0:
return None
data = self.top.data
self.top = self.top.next
self.count -= 1
return data
def isEmpty(self) -> bool:
if self.count == 0:
return True
else:
return False
def getTop(self) -> int:
if self.count == 0:
return None
return self.top.data
def getDataStr(self) -> str:
dataStr = ''
node = self.top
while node:
dataStr += str(node.data) + ''
node = node.next
return dataStr
def printStr(self) -> str:
printStr = ''
node = self.top
while node:
printStr += str(node.data) + ' -> '
node = node.next
printStr += 'End'
return printStr
'''
检验括号匹配
比较含退格的字符串
'''
class StackSolutions:
'''
检验括号的匹配,leetcode 20
'''
def isValid(self, s: str) -> bool:
# stack = SequenceStack(1000)
stack = LinkedStack(1000)
for x in s:
if x in '({[':
stack.push(x)
else:
y = stack.pop()
if not y or (x == ')' and y != '(') or (x == '}' and y != '{') or (x == ']' and y != '['):
return False
return stack.isEmpty()
'''
比较含退格的字符串,leetcode 844
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
'''
def backspaceCompare(self, S: str, T: str) -> bool:
s = self.getBackspaceStr(S)
t = self.getBackspaceStr(T)
return s == t
def getBackspaceStr(self, s: str) -> str:
# stack = SequenceStack(1000)
stack = LinkedStack(1000)
for i in s:
if i == '#':
stack.pop()
else:
stack.push(i)
return stack.getDataStr()
代码已经上传到 GitHub,感兴趣的可以看看
这两周一起复习了栈最基础的操作,现在对这些思路和方法做一下总结
- 栈的特点
- 操作受限,只有入栈、出栈操作
- 栈的常见场景
- “洋葱”型的操作,例如:检验括号匹配、函数调用栈
- 包含回退操作,例如:浏览器的回退操作、含退格的字符
- 针对不同优先级的操作,例如:表达式求值
Review
程序员的提问智慧,结合自己的理解,写在下面这里~
Tip
字符乱码问题产生原因参考
Share