目录:
前言
1:栈
1.1:栈的实现
1.2:栈的应用:
1.2.1:检验数学表达式的括号匹配
1.2.2:将十进制数转化为任意进制
1.2.3:后置表达式的生成及其计算
2:队列
2.1:队列的实现
2.2:队列的应用之囚徒问题
3:双端队列
3.1:双端队列的实现
3.2:双端队列的应用之回文检测
4:列表
3.1:链表的实现
前言
线性数据结构有四种:栈(stack),队列(queue),双端队列(deque),列表(list)
线性数据结构就是一群数据的集合,数据的位置和其加入的先后顺序有关,并且由此将其看为有两端,头(top)与尾(rear)【其中认为头是最先加入的数据,尾是最后加入的数据】
一:栈(stack)
1:栈的构造
栈可以看成是堆盘子,只能从上端加入以及从上端取出,也就是只能从一端对其进行操作。对应到线形结构就是只能在尾部对其进行加入与删除的数据结构。简称LIFO(last in first out),即是后进先出。
习惯上我们把栈尾部叫做栈顶(TOP),加入数据叫做压栈(push),删除叫做出栈(pop)
要注意一点的是,此处的栈顶其实是list的队尾,理论上将两个top对应起来也是简单的,但是前面讲过list的insert(0,i)与pop(0)都是O(n)的操作,而末尾的append(i)与pop(i)都是O(1),故依旧选择后者。
1 class Stack: 2 def __init__(self,*args): 3 self.cstack = [] #c:construct 4 for i in args: 5 self.cstack.append(i) 6 def push(self,x): #压栈 7 self.cstack.append(x) 8 def size(self): #查看元素个数 9 return len(self.cstack) 10 def pop(self): #出栈 11 if self.size()>0: 12 return self.cstack.pop() 13 else: 14 print('Sorry, this is an empty stack') 15 def peek(self): #检查栈顶元素是什么 16 if self.size()>0: 17 return self.cstack[len(self.cstack)-1] 18 else: 19 return 'empty stack'