源代码--数据结构与算法(Python版)chap6 线性表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
else: substr = self.chars[iPos:iPos+length] print("获取的字串为:",substr)
26
22
串
串是由零个或多个字符组成的有限序列 s=“a1a2…an”(n0,串长度)
子串:串中任意个连续的字符组成的子序列。 主串:包含子串的串相应地称为主串。 位置:字符在序列中的序号。子串在主串中的位置则以子串的第一个字 符在主串中的位置来表示。 相等:两个串的长度相等,并且对应位置的字符都相等。 长度:字符个数 空串:string="",长度为0 空格串:stringBlank=" ",仅含一个空格,长度为1 字串:串中任何连续字符组成 主串:包含子串b的串,称为b的主串 真子串:串的所有字串,除了自身以外 字串的位置:子串中第一个字符的位置 串相等:长度和位置相等
'''链表头部添加元素'''
def add(self, item): node = Node(item) node.next = self.__head self.__head = node
‘’‘链表尾部添加元素'''
def append(self, item): '''链表尾部添加元素''' node = Node(item) # 由于特殊情况当链表为空时没有next,所以在前面要做个判断 if self.is_empty(): self.__head = node else: cur = self.__head while cur.next != None: cur = cur.next cur.next = node
4
链式存储
链式存储通过一组含有指针的存储单元来 存储线性表的数据及其逻辑关系。采用链 式存储的线性表通常称为单链表。单链表 节点的结构,除存放元素的数据域(data) 外,还有存放后继元素地址的指针域(next )
data next
5
链式存储
节点数据类型可表示为: class SingleNode(object): """单链表的结点"""
front
rear FF EE DD CC
front
rear=front=-1 (1)空对
front=-1, rear=4 (2)1个元素
front=2, rear=4 (3)一般情况
front=2, rear=5 (4)假溢出
19
顺序存储
为了解决假溢出,将队列的数据区的头尾衔接,形成头尾相接的循环结 构,此时对头前的空位置将可以被使用。但这样会出现“队满”和“队 空”条件混淆的问题。
第6章 线性表
线性表
相关概念
线性表是最常用的数据结构之一,它是由n(n≥0) 个数据元素(节点)组成的满足如下条件的有限序列 (a0,a1…,an-1):
当i=1,...,n-1 时,ai有且仅有一个直接前趋ai-1; 当i=0,1,...,n-2 时,有且仅有一个直接后继ai+1; 表中第一个元素a0没有前趋; 最后一个元素an-1无后继。 数据元素的个数n称为线性表长度,长度为0时称为空
self.chars=self.chars+stringSrc
else:
print("两个字符的长度之和溢出,超过的部分无法显示")
size=self.MaxStringSize-len(self.chars)
self.chars=self.chars+stringSrc[:size]
print("连接后字符串为:",self.chars)
def __init__(self,item): self.item=item #item存放数据元素 self.next=None #next是下一个结点的标识
6
(1)创建单链表:包括判断链表是否为空 ;求链表的长度;遍历整个链表。
(2)线性表的查找:查找节点是否存在。 (3)线性表的插入:包括在链表头部、链
'''查找节点是否存在'''
栈
栈是一种要求插入或删除操作都在表尾进行的线性表,具有 先进后出(FILO)的特性,即最先进入的元素最后被释放。 栈的逻辑结构所示。
14
class Stack(object):
def __init__(self):
#初始化
self.items=[]
def is_empty(self): #判断栈是否为空
ห้องสมุดไป่ตู้
else:
self.chars=stringSH
24
串连接
def StringConcat(self,strSrc):
# 串连接
lengthSrc = len(strSrc)
stringSrc = strSrc
if lengthSrc + len(self.chars) <= self.MaxStringSize:
20
顺序存储
6
7
5
0
rear
4
1 front
3
2
(a)
6
G 5
F
6
7
G 5
F
H
0 K
E 4
D
rear L
1 front C
3
2
(b) 7
H
rear
0
4E D
L 1 front
C
3
2
(c)
21
class Queue(object):
def __init__(self):
self.items=[]
def is_empty(self):
#判断队列是否为空
return self.items==[]
def enqueue(self,item):
#入队列
self.items.insert(0,item)
def dequeue(self):
#出队列
return self.items.pop()
def size(self):
#队列元素个数
return len(self.items)
队空时:m=0
这种顺序存储方式将可能会发生“假溢出”。随着入队、出 队的进行,整个队列整体向后移动,队尾指针已经移到了最 后,仿佛队列已满,而事实上队列中并未真满,在对头前有 空位置,称这种现象为“假溢出”。
5
4 3
2 1 0 rear front
rear EE DD
CC BB AA front
rear EE DD CC
23
创建串
def CreateString(self):
# 创建串
stringSH= input("请输入字符串:")
if len(stringSH) > self.MaxStringSize:
print("溢出,超过的部分无法保存")
self.chars=stringSH[:self.MaxStringSize]
self.append(item)
else:
per = self.__head
count = 0
while count < pos - 1:
count += 1
per = per.next
# 当循环退出后,pre指向pos-1位置
node = Node(item)
node.next = per.next
25
取长度为length的子串
def SubString(self,iPos,length): # 从iPos位置开始,取长度为length的子串 if iPos>len(self.chars)-1 or iPos<0 or length<1 or
(length+iPos)>len(self.chars): print("无法获取")
def size(self):
#返回栈的大小
return len(self.items)
队列
队列是只允许在一端进行插入,另一端只允许删除的线性表 ,具有先进先出(FIFO)的特性。
出队列 a1 a2 … an 入队列
头队
尾队
队列存储有顺序存储和链式存储两种方式。
18
顺序存储
队满时:m== MAXSIZE
per.next = node
‘’‘删除节点'''
def remove(self, item):
'''删除节点'''
cur = self.__head
pre = None
while cur != None:
if cur.elem == item: # 先判断该节点是否是头结点
if cur == self.__head:
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]
6
7
rear
5
0
F
E 4
D
3
C 2
1 front
图(a)为队空情况下front==rear;图b为队满情况下front==rear。“队满” 和“队空”的条件是相同的,将出现混淆。为解决该问题,其中一种方 法是少用一个存储空间,如图(c)所示,此时队满的条件变为:
(rear+1) %MAXSIZE==front
self.__head = cur.next
else:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
‘’‘查找节点是否存在'
def search(self, item): cur = self.__head while not cur: if cur.elem == item: return True else: cur = cur.next return False
表尾部添加元素和在指定位置添加元素。
(4)线性表的删除:删除节点
'''遍历整个列表'''
def travel(self):
'''遍历整个列表'''
cur = self.__head
while cur != None:
print(cur.elem, end=' ')
cur = cur.next
print("\n")
表。数据元素可以是单一类型的数据,如整数、字符 串等,也可以由若干个数据项组成的结构体,如学生 信息(学号,姓名,班级)等。
2
线性表的存储
顺序存储 链式存储
3
线性存储
线性表的节点按逻辑次序依次存放 在地址连续的存储单元中,使得逻 辑上相邻的元素在物理位置上亦相 邻。用这种方法实现的线性表简称 为顺序表。Python中list和tuple两 种数据类型实现顺序表。
‘’‘指定位置添加元素'''
def insert(self, pos, item):
'''指定位置添加元素'''
if pos <= 0: # 如果pos位置在0,当做头插法
self.add(item)
elif pos > self.length() - 1:
# 如果pos位置比原链表长,那么都当做尾插法来做
26
22
串
串是由零个或多个字符组成的有限序列 s=“a1a2…an”(n0,串长度)
子串:串中任意个连续的字符组成的子序列。 主串:包含子串的串相应地称为主串。 位置:字符在序列中的序号。子串在主串中的位置则以子串的第一个字 符在主串中的位置来表示。 相等:两个串的长度相等,并且对应位置的字符都相等。 长度:字符个数 空串:string="",长度为0 空格串:stringBlank=" ",仅含一个空格,长度为1 字串:串中任何连续字符组成 主串:包含子串b的串,称为b的主串 真子串:串的所有字串,除了自身以外 字串的位置:子串中第一个字符的位置 串相等:长度和位置相等
'''链表头部添加元素'''
def add(self, item): node = Node(item) node.next = self.__head self.__head = node
‘’‘链表尾部添加元素'''
def append(self, item): '''链表尾部添加元素''' node = Node(item) # 由于特殊情况当链表为空时没有next,所以在前面要做个判断 if self.is_empty(): self.__head = node else: cur = self.__head while cur.next != None: cur = cur.next cur.next = node
4
链式存储
链式存储通过一组含有指针的存储单元来 存储线性表的数据及其逻辑关系。采用链 式存储的线性表通常称为单链表。单链表 节点的结构,除存放元素的数据域(data) 外,还有存放后继元素地址的指针域(next )
data next
5
链式存储
节点数据类型可表示为: class SingleNode(object): """单链表的结点"""
front
rear FF EE DD CC
front
rear=front=-1 (1)空对
front=-1, rear=4 (2)1个元素
front=2, rear=4 (3)一般情况
front=2, rear=5 (4)假溢出
19
顺序存储
为了解决假溢出,将队列的数据区的头尾衔接,形成头尾相接的循环结 构,此时对头前的空位置将可以被使用。但这样会出现“队满”和“队 空”条件混淆的问题。
第6章 线性表
线性表
相关概念
线性表是最常用的数据结构之一,它是由n(n≥0) 个数据元素(节点)组成的满足如下条件的有限序列 (a0,a1…,an-1):
当i=1,...,n-1 时,ai有且仅有一个直接前趋ai-1; 当i=0,1,...,n-2 时,有且仅有一个直接后继ai+1; 表中第一个元素a0没有前趋; 最后一个元素an-1无后继。 数据元素的个数n称为线性表长度,长度为0时称为空
self.chars=self.chars+stringSrc
else:
print("两个字符的长度之和溢出,超过的部分无法显示")
size=self.MaxStringSize-len(self.chars)
self.chars=self.chars+stringSrc[:size]
print("连接后字符串为:",self.chars)
def __init__(self,item): self.item=item #item存放数据元素 self.next=None #next是下一个结点的标识
6
(1)创建单链表:包括判断链表是否为空 ;求链表的长度;遍历整个链表。
(2)线性表的查找:查找节点是否存在。 (3)线性表的插入:包括在链表头部、链
'''查找节点是否存在'''
栈
栈是一种要求插入或删除操作都在表尾进行的线性表,具有 先进后出(FILO)的特性,即最先进入的元素最后被释放。 栈的逻辑结构所示。
14
class Stack(object):
def __init__(self):
#初始化
self.items=[]
def is_empty(self): #判断栈是否为空
ห้องสมุดไป่ตู้
else:
self.chars=stringSH
24
串连接
def StringConcat(self,strSrc):
# 串连接
lengthSrc = len(strSrc)
stringSrc = strSrc
if lengthSrc + len(self.chars) <= self.MaxStringSize:
20
顺序存储
6
7
5
0
rear
4
1 front
3
2
(a)
6
G 5
F
6
7
G 5
F
H
0 K
E 4
D
rear L
1 front C
3
2
(b) 7
H
rear
0
4E D
L 1 front
C
3
2
(c)
21
class Queue(object):
def __init__(self):
self.items=[]
def is_empty(self):
#判断队列是否为空
return self.items==[]
def enqueue(self,item):
#入队列
self.items.insert(0,item)
def dequeue(self):
#出队列
return self.items.pop()
def size(self):
#队列元素个数
return len(self.items)
队空时:m=0
这种顺序存储方式将可能会发生“假溢出”。随着入队、出 队的进行,整个队列整体向后移动,队尾指针已经移到了最 后,仿佛队列已满,而事实上队列中并未真满,在对头前有 空位置,称这种现象为“假溢出”。
5
4 3
2 1 0 rear front
rear EE DD
CC BB AA front
rear EE DD CC
23
创建串
def CreateString(self):
# 创建串
stringSH= input("请输入字符串:")
if len(stringSH) > self.MaxStringSize:
print("溢出,超过的部分无法保存")
self.chars=stringSH[:self.MaxStringSize]
self.append(item)
else:
per = self.__head
count = 0
while count < pos - 1:
count += 1
per = per.next
# 当循环退出后,pre指向pos-1位置
node = Node(item)
node.next = per.next
25
取长度为length的子串
def SubString(self,iPos,length): # 从iPos位置开始,取长度为length的子串 if iPos>len(self.chars)-1 or iPos<0 or length<1 or
(length+iPos)>len(self.chars): print("无法获取")
def size(self):
#返回栈的大小
return len(self.items)
队列
队列是只允许在一端进行插入,另一端只允许删除的线性表 ,具有先进先出(FIFO)的特性。
出队列 a1 a2 … an 入队列
头队
尾队
队列存储有顺序存储和链式存储两种方式。
18
顺序存储
队满时:m== MAXSIZE
per.next = node
‘’‘删除节点'''
def remove(self, item):
'''删除节点'''
cur = self.__head
pre = None
while cur != None:
if cur.elem == item: # 先判断该节点是否是头结点
if cur == self.__head:
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]
6
7
rear
5
0
F
E 4
D
3
C 2
1 front
图(a)为队空情况下front==rear;图b为队满情况下front==rear。“队满” 和“队空”的条件是相同的,将出现混淆。为解决该问题,其中一种方 法是少用一个存储空间,如图(c)所示,此时队满的条件变为:
(rear+1) %MAXSIZE==front
self.__head = cur.next
else:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
‘’‘查找节点是否存在'
def search(self, item): cur = self.__head while not cur: if cur.elem == item: return True else: cur = cur.next return False
表尾部添加元素和在指定位置添加元素。
(4)线性表的删除:删除节点
'''遍历整个列表'''
def travel(self):
'''遍历整个列表'''
cur = self.__head
while cur != None:
print(cur.elem, end=' ')
cur = cur.next
print("\n")
表。数据元素可以是单一类型的数据,如整数、字符 串等,也可以由若干个数据项组成的结构体,如学生 信息(学号,姓名,班级)等。
2
线性表的存储
顺序存储 链式存储
3
线性存储
线性表的节点按逻辑次序依次存放 在地址连续的存储单元中,使得逻 辑上相邻的元素在物理位置上亦相 邻。用这种方法实现的线性表简称 为顺序表。Python中list和tuple两 种数据类型实现顺序表。
‘’‘指定位置添加元素'''
def insert(self, pos, item):
'''指定位置添加元素'''
if pos <= 0: # 如果pos位置在0,当做头插法
self.add(item)
elif pos > self.length() - 1:
# 如果pos位置比原链表长,那么都当做尾插法来做