数据结构笔记
目录
第三章
什么是线性结构
不同线性结构的关键区别在于数据项增减的方式:
线性结构是应用最广泛的数据结构。
栈抽象数据类型及 python 实现
什么是栈
栈的特性:反转次序
栈的操作
栈的实现
将列表末端作为栈底定义一个栈:
class Stack():
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self,item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
将列表首部作为栈底对栈的实现:
栈的应用:简单括号匹配
算法流程:
代码如下:
from StackDefination import Stack
def parChecker(symbolString):
s = Stack()
balanced = True
index = 0
while index < len(symbolString) and balanced:
symbol = symbolString[index]
if symbol == '(':
s.push(symbol)
else: #symbol == ')'
if s.isEmpty():
balanced = False
else:
s.pop()
index += 1
if balanced and s.isEmpty():
return True
else:
return False
print(parChecker('((())()))')) ==>False
print(parChecker('((()))')) ==>True
如果括号还包括中括号与花括号,则需要有所改动:
栈的应用:十进制转换为二进制
代码如下:
from StackDefinition import Stack
def divideBy2(decNumber):
s = Stack()
while decNumber > 0:
rem = decNumber % 2
s.push(rem)
decNumber = decNumber // 2
binString = ''
while not s.isEmpty():
binString = binString + str(s.pop())
return binString
print(divideBy2(158)) ==>10011110
当将十进制转换为十六进制时,10 至 15 需要用 A~F 代替,以下为将十进制数字转化为 16 以下进制的代码:
栈的应用:表达式转换
中缀表达式
全括号中缀表达式
前缀和后缀表达式
中缀表达式转换为前缀和后缀形式
通用的中缀转后缀算法
流程
实例
代码如下:
栈的应用:后缀表达式求值
计算 4 5 6 * +:
代码如下:
from StackDefinition import Stack
def postfixEval(postfixExpr):
s = Stack()
tokenList = postfixExpr.split()
for i in tokenList:
if i in '0123456789':
s.push(int(i))
else:
oop2 = s.pop()
oop1 = s.pop()
result = doMath(i,oop1,oop2)
s.push(result)
return s.pop()
def doMath(op, op1, op2):
if op == '*':
return op1 * op2
elif op == '+':
return op1 + op2
elif op == '-':
return op1 - op2
elif op == '/':
return op1 / op2
print(postfixEval('2 4 5 1 * + -')) ==>-7