IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 基本数据结构-栈和队列,排序与搜索 -> 正文阅读

[数据结构与算法]基本数据结构-栈和队列,排序与搜索

定义

后进先出(LIFO)的线性表,只有一端可以操作

实现

  1. 创建容器(空列表)
class Stack(object):
    """栈"""
    def __init__(self):
         self._list = [] #建立为私有,不允许更改

  1. 判断是否为空
    def is_empty(self):
        return self.items == []
	
		#也可以是return not self.__list
	
  1. 压栈
    def push(self, item):
        self.__list.append(item) #添加元素到栈顶
  1. 弹出元素
	def pop(self):
       return self.__list.pop() #弹出栈顶元素
  1. 返回栈顶元素
	def peek(self):
   	if self.__list:
       	return self.__list[-1] #栈从栈底开始计数
   	else:
   		return None
   	
  1. 返回栈的大小
	def size(self):
        return len(self.__list)
  1. 测试
if __name__ == "__main__":
    stack = Stack()
    stack.push("hello")
    stack.push("world")
    stack.push("itcast")
    print stack.size()
    print stack.peek()
    print stack.pop()
    print stack.pop()
    print stack.pop()

队列

定义

先进先出的(FIFO)的线性表,只允许在一端进行插入操作,而在另一端进行删除操作

实现

  1. 创造队列
class Queue(object):
   """队列"""
   def __init__(self):
       self.items = [] #创造list作为容器
  1. 判空
    def is_empty(self):
        return self.items == []

3.进队列

    def enqueue(self, item):        
        self.items.append(item)   #尾部添加
		#self.items.insert(0,item) #头部添加
  1. 出队列
    def dequeue(self):    
        return self.items.pop(0) #头部出,要输出元素
		#return self.items.pop() #尾部出
  1. 返回大小
    def size(self):
        return len(self.items)
  1. 测试
if __name__ == "__main__":
    q = Queue()
    q.enqueue("hello")
    q.enqueue("world")
    q.enqueue("itcast")
    print q.size()
    print q.dequeue()
    print q.dequeue()
    print q.dequeue()

双端队列

  • 两个栈底部合在一起

实现

class Deque(object):
    """双端队列"""
    def __init__(self):
        self.items = []

    def is_empty(self):
        """判断队列是否为空"""
        return self.items == []

    def add_front(self, item):
        """在队头添加元素"""
        self.items.insert(0,item)

    def add_rear(self, item):
        """在队尾添加元素"""
        self.items.append(item)

    def remove_front(self):
        """从队头删除元素"""
        return self.items.pop(0)

    def remove_rear(self):
        """从队尾删除元素"""
        return self.items.pop()

    def size(self):
        """返回队列大小"""
        return len(self.items)


if __name__ == "__main__":
    deque = Deque()
    deque.add_front(1)
    deque.add_front(2)
    deque.add_rear(3)
    deque.add_rear(4)
    print deque.size()
    print deque.remove_front()
    print deque.remove_front()
    print deque.remove_rear()
    print deque.remove_rear()

排序

  • 算法稳定性:排序之后相同的子序列位置不变
(4,1)(3,1)(3,7)(5,6)

(3,1)(3,7)(4,1)(5,6) (维持次序)
(3,7)(3,1)(4,1)(5,6) (次序被改变)

冒泡排序

  1. 定义
    它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
  2. 顺序表实现
  • 稳定
def bubble_sort(alist)
	n = len(alist)
	for j in range(n-1):#控制要走多少次
		count = 0
		for i in range(0,n-1-j): #游标i一次从到位的遍历和比较
			if alist[i]>alist[i+1]:
				alist[i],alist[i+1] = alist[i+1],alist[i]
				count += 1
		if 0 == count:
			return

def bubble_sort(alist):
    for j in range(len(alist)-1,0,-1):
        # j表示每次遍历需要比较的次数,是逐渐减小的
        for i in range(j):
            if alist[i] > alist[i+1]:
                alist[i], alist[i+1] = alist[i+1], alist[i]
			
		

选择排序

  • 找到后面子数列里最小的放到前面
  • 不稳定
def select_sort(alist)
	n = len(alist)
	for j in range(0,n-1): #j:0~n-2
		min_index = j
		for i in range(j+1,n):
			if alist(min_index)>alist[i]:
				min_index = i
		alist[j],alist[min_index] = alist[min_index],alist[j]

插入算法

  • 稳定
def insert_sort(alist):
	n = len(alist)
	for j in range(1,n): #从右侧无序序列中取出多少数
		i = j  #起始值
		while i > 0:
			if alist[i]<alist[i-1]:
				alist[i],alist[i-1]=alist[i-1],alist[i]
			    i-=1
			else:         #已经有序的特殊状况
				break
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 12:20:33  更:2021-08-07 12:22:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:40:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码