数据结构与算法(2):基本数据结构(栈、队列、链表)

博客介绍基本线性数据结构,包括栈、队列和链表。栈遵循后进先出策略,队列遵循先进先出策略,还有可两端操作的双向队列。链表有多种类型,单链表由头指针确定,每个结点含数据和下一结点引用,还介绍了用Python列表实现这些数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本数据结构

1. 线性数据结构

线性数据结构是指元素与其前后元素相对位置保持不变的数据集合。线性数据结构具有两端,分别为:左端、右端(也称:前端+后端/顶端+底端)。基本的数据结构中,栈、队列、链表、串和数组都属于线性数据结构,这些基本数据结构的区别在于添加元素和移除元素的顺序

2. 栈

2.1 栈

栈实现的是后进先出(last-in,first-out,LIFO)的策略,其添加和移除如下图所示。

栈的移除和添加只在顶端进行,移除操作时,只能先移除7、再移除6、接着移除5…,添加操作时,新加入的元素压入栈顶。

2.2 python列表实现栈

class stack:
	def __init__(self):#创建栈
		self.items = []
	
	def isEmpty(self):#判断栈是否为空
		return self.items == []
	
	def push(self, item):#添加元素
		return 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)

3. 队列

3.1 队列

队列实现的是先进先出(fist-in,first-out,FIFO)的策略,其添加和移除如下图所示。

队列的移除和添加分别在两端进行,移除操作时,只在右端进行移除,只能先移除7、再移除6、接着移除5…,添加操作时,在左端加入。新加入的元素需等待前面的元素移出后才能被取出。

3.2 python列表实现队列

class Queue:
    def __init__(self):#创建队列
        self.items = []
    
    def isEmpty(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)

3.3 双向队列

3.1和3.2节介绍的是“单向队列”,在队列中还存在另外一种数据结构——双向队列。
双向队列的两端都可以进行移除元素和添加元素操作。

#python实现
class Queue:
    def __init__(self):#创建队列
        self.items = []
    
    def isEmpty(self):#判断是否为空
        return self.items == []
    
    def leftEnqueue(self, item):#左端添加元素
        self.items.insert(0, item)
        
    def leftDequeue(self):#左端移除元素
        return self.items.pop(0)
    
    def rightEnqueue(self, item):#右端添加元素
        self.items.append(item)
        
    def rightDequeue(self):#右端移除元素
        return self.items.pop()
    
    def size(self):#返回队列长度
        return len(self.items)

4. 链表

4.1 链表

链表分为单链表、循环链表、双向链表、二叉链表、十字链表、邻接表和邻接多重表。
单链表:整个链表的存储从从头指针开始,头指针指向链表的第一个结点(即第一个数据元素,也称为首元结点)的存储位置,而最后一个结点的指针为空。

数据存储示例
对应单链表逻辑状态

头指针可唯一确定单链表;
每一个结点包含数据变量和下一个结点的引用。
首元结点指链表中存储第一个数据元素的结点(ZHAO),头结点指首元结点之前的结点(L),头指针是指向链表第一个结点的指针。

4.2 python列表实现单链表

class Node:#结点类
	def __init__(self, initdata):#初始化
		self.data = initdata
		self.next = None
	
	def getData(self):#返回数据
		return self.data
	
	def getNext(self):#返回引用
		return self.next
	
	def setData(self, newdata):#存储数据
		self.data = newdata
	
	def setNext(self, newnext):#存储引用
		self.next= newnext
class linkList:#链表类
	def __init__(self):
		self.head = None
		self.tail = None
	
	def isEmpty(self):#链表是否为空
		return self.head = None
	
	def addHead(self, item):#添加元素,头插法
		newnode = Node(item)
		newnode.setNext(self.head)
		self.head = newnode
	
	def addTail(self, item):#添加元素,尾插法
		newnode = Node(item)
		self.tail.setNext(newnode)
		self.tail= newnode
		
	def remove(self, item):#移除指定元素
		cur = self.head
		pre = None
		flag= True
		while flag:#获取移除元素位置
			if cur.getData() == item:
				flag = False
			else:
				pre = cur
				cur = cur.getNext()
		
		if pre == None:#移除
			self.head = cur.getNext()
		else:
			pre.setNext(cur.getNext())

	def getLength(self):#返回链表长度
		cur = self.head
		count = 0
		while cur != None:
			count += 1
			cur = cur.getNext()
		
		return count
	
	def insert(self, item, pos):#在第pos个结点后插入新结点
		newnode = Node(item)
		cur = self.head
		for i in range(pos):cur = cur.getNext()
		newnode.setNext(cur.getNext())
		cur.setNext(newnode)
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值