目录
- 1、栈
 - 1.1 栈的介绍
 - 1.2 栈的代码实现
 
- 2、队列
 - 2.1 队列的介绍
 - 2.2 队列的代码实现
 
- 3、双端队列
 - 4、数据结构与算法_排序算法
 - 4.1 排序算法的稳定性
 - 4.2 冒泡排序
 - 4.3 选择排序
 - 4.4 插入排序
 - 4.5 快速排序
 
1、栈
1.1 栈的介绍
栈:运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算,这一端为栈顶,另一端为栈底。特点:先进后出
 栈是计算机系统CPU结构里的一部分
 栈的作用:局部变量的方便存储和及时销毁

1.2 栈的代码实现
借助链表
 
 所以选择尾部进行增删操作
class Stack(object):
	"""栈:先进后出"""
	def __init__(self):
		self.__items = []
	def push(self):
		"""进栈"""
		self.__items.append(item)
	def pop(self):
		"""出栈"""
		self.__items.pop()
	def trave(self):
		"""遍历"""
		for i in self.__items:
			print(i)
my_stack = Stack()
my_stack.push(1)
my_stack.push(1)
my_stack.push(1)
my_stack.trave()  #输出1\n 2\n 3\n
#出栈
my_stack.pop()
my_stack.trave()  #输出1\n 2\n
 
2、队列
2.1 队列的介绍
队列:一种特殊的线性表,特殊之处在于它只允许表的头部进行删除操作,表的尾部进行插入操作,是一种操作受限制的线性表,进行插入操作的端为队尾,进行删除操作的端为队头
队列的作用:任务处理类系统(多个任务发起,先存储起来,排队一个一个进行处理,起到了缓冲压力的作用)
2.2 队列的代码实现

 此时选择对头队尾,复杂度都一样了,o(1)+o(n)

Class Queue(object):
	def __init__(self):
		#存储数据,线性表
		self.items = []
	#enqueue(item)队列尾部添加元素
	def enqueue(self,item):
		self.items.append(item)
	#dequeue(item)队列头添加元素
	def dequeue(self,item):
		self.items.pop(0)
	#is_empty()判断队列是否为空
	def is_empty()(self):
		return self.items == []
	#size()返回队列的大小
	def size(self):
		return len(self.items)
q = Queue()
#添加数据
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
for i in q.items:
	print(i)  #输出:1\n2\n3\n
#删除数据
q.dequeue() 
for i in q.items:
	print(i)  #输出:2\n3\n
print(q.is_empty())
print(q.size())
 
3、双端队列
双端队列:是一种具有队列和栈的数据结构。元素可以任意从两端进行插入和删除操作。
 
 
Class Deque(object):
	def __init__(self):
		self.items = []
	def is_empty(self): #判断是否为空
		return self.items == []
	def size(self):  #大小
		return len(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,item): #头部删除数据
		self.items.pop(0)
	def remove_rear(self,item):  #尾部删除数据
		self.items.pop()
deque = Deque()
print(deque.is_empty())
print(deque.size())
#添加数据
deque.add_front(1)
deque.add_front(2)
deque.add_rear(3)
deque.add_rear(4)
for i in q.items:
	print(i)  #输出:2\n1\n3\n4\n
#删除数据
deque.remove_front()
deque.remove_rear()
for i in q.items:
	print(i)  #输出:1\n3\n
 
4、数据结构与算法_排序算法
4.1 排序算法的稳定性
排序:使得一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来
 排序算法:如何使得这一串记录按照要求排列的方法
算法的稳定性:
 
 对于具有相同的关键词的记录,他们的相对次序不变,即这种算法是稳定的,否则是不稳定的
 不稳定的排序算法:选择排序、快速排序、希尔排序、堆排序
 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序
4.2 冒泡排序
冒泡排序:重复地走访过要排序的元素列,依次比较两个相邻的元素,如果元素排序错误就交换过来。重复进行直到没有相邻元素需要交换为止
代码实现:
def bubble_sort(alist):
	"""冒泡排序"""
	n=len(alist)
	for j in range(0,n-1):
		count =0
		for i in range(0,n-j-1): #控制每一轮的比较次数
			#比较相邻两数字,不符合要求便交换位置
			if alist[i]>alist[i+1]:
				alist[i],alist[i+1] =alist[i+1],alist[i]
				count +=1
		if count == 0: #如果遍历一轮后没有数字交换,就退出循环,防止浪费资源
			break
if __name__ == '__main__':
	alist = [5,3,4,7,2]
	bubble_sort(alist)
	print(alist)
 
冒泡排序:
 时间复杂度:o(n^2)
 最优时间复杂度 :o(n) 最少也需要遍历一遍
 算法稳定性:稳定算法 (if alist[i]>alist[i+1]中如果是>= ,则不是稳定算法)
4.3 选择排序
选择排序:第一次从待排序的数据元素中选出最小(大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,放到已排序的序列末尾,依次类推,直到全部排序完
 
def select_sort(alist):
	"""选择排序"""
	n = len(alist) #列表的长度
	for j in range(0,n):
		min_index = j #假定的最小值下标
		for i in range(j+1,n):
			if alist[i] < alist[min_index]:   #进行比较获得最小值的下标
				min_index = i
		if min_index !=j:
			alist[min_index],alist[j] = alist[j],alist[min_index]
if __name__ == '__main__':
	alist = [1,5,3,4,7,2]
	select_sort(alist)
	print(alist)
 
选择排序:
 时间复杂度:o(n^2)
 最优时间复杂度 :o(n^2)
 算法稳定性:不稳定算法
4.4 插入排序
插入排序:将一个数据插入到已经排好序的有序数据中,从而得到一个新的,个数加一的有序数据,算法适用于少量数据的排序。排序时将第一个数作为有序数据
 
def insert_sort(alist):
	"""插入排序"""
	n = len(alist) #列表长度
	for j in range(1,n): #控制轮数
		for i in range(j,0,-1):#找到合适的位置安放我们的无序数据[j,j-1,j-2,...1]
			if alist[i]<alist[i-1]:
				alist[i],alist[i-1] =alist[i-1],alist[i]
			else:
				break
if __name__ == '__main__':
	alist = [1,5,3,4,7,2]
	insert_sort(alist)
	print(alist)
 
插入排序:
 时间复杂度:o(n^2) – 降序数据变成升序
 最优时间复杂度 :o(n) – 原本就是升序数据
 算法稳定性:稳定算法 (if alist[i]<alist[i+1]中如果是<= ,则不是稳定算法)
4.5 快速排序

 
def quick_sort(alist,start,end):
	"""快速排序"""
	#递归的结束条件
	if start>=end:
		return 
	#界限值
	mid = alist[start]
	#左右游标
	left = start
	right = end
	while left <right:
		while alist[right]>=mid and left<right : #从右边开始找寻小于mid的值,归类到左边
			right -=1
		slist[left] = alist[right]
		while alist[left]<mid and left<right:
			left +=1
		slist[right] = alist[left]
	#循环一旦结束了,证明找到了mid应该在的位置
	alist[left] = mid
	#递归操作
	quick_sort(alist,start,left-1)
	quick_sort(alist,right+1,end)
if __name__ == '__main__':
	alist = [1,5,3,4,7,2]
	quick_sort(alist,0,len(alist)-1)
	print(alist)
 
快速排序:
 时间复杂度:o(n^2)
 最优时间复杂度 :o(nlogn)
 
算法稳定性:不稳定算法



















