数据结构第三章笔记

数据结构笔记



第三章

什么是线性结构

在这里插入图片描述
不同线性结构的关键区别在于数据项增减的方式:
在这里插入图片描述
线性结构是应用最广泛的数据结构。

栈抽象数据类型及 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值