什么是线性数据结构 对于某种数据集合,一旦某个元素被添加进来,它与前后元素的相对位置保持不变,这样的数据集合就被称为线性数据结构。
线性数据结构可以看做有两端。这两段可以被称为”左端””右端”,有时候也被称为”前端””后端”或者”顶端””底端”。
栈 栈有时候也被称为”下推栈”,是一个有序集合。添加操作和移除操作总发生在顶端。栈是后进先出(LIFO)的集合。
Python 的 list 方法 使得列表作为堆栈非常容易:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 >>>  stack = [3 , 4 , 5 ]>>>  stack.append(6 ) >>>  stack.append(7 )>>>  stack[3 , 4 , 5 , 6 , 7 ] >>>  stack.pop()7 >>>  stack[3 , 4 , 5 , 6 ] >>>  stack.pop()6 >>>  stack.pop()5 >>>  stack[3 , 4 ] 
队列与双端队列 队列是有序集合,添加操作发生在后端,移除操作发生在前端。队列是先进先出(FIFO)的集合。
双端队列则对两端的添加和移除没有任何限制。
Python 列表也可以用作队列,但在列表开头插入或移除元素较慢,因此效率很低。用 collections.deque  可以快速在两端添加或删除元素:
1 2 3 4 5 6 7 8 9 10 11 12 >>>  from  collections import  deque>>>  queue = deque(["Eric" , "John" , "Michael" ])>>>  queue.append("Terry" )           >>>  queue.append("Graham" )          >>>  queuedeque(['Eric' , 'John' , 'Michael' , 'Terry' , 'Graham' ]) >>>  queue.popleft()                 'Eric' >>>  queue.popleft()                 'John' >>>  queue                           deque(['Michael' , 'Terry' , 'Graham' ]) 
列表 这里所指的列表区别于 Python 的 list ,是计算机科学中的一种抽象数据类型。列表是有限的有序值得集合,每个值可以出现多次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 class  Node :    def  __init__ (self, initdata) :         self.data = initdata         self.next = None           def  get_data (self) :         return  self.data          def  get_next (self) :         return  self.next          def  set_data (self, newdata) :         self.data = new_data          def  set_next (self, newnext) :         self.next = newnext              def  remove (self, item) :         current = self.head         previous = None          found = False          while  not  found:             if  current.get_data() == item:                 found = True              else :                 previous = current                 current = current.get_next()                  if  previous == None :             self.head = current.get_next()         else :             previous.set_next(current.get_next()) 
无序列表 无序列表中的每个元素都有相对于其他元素的位置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 class  UnorderedList :    def  __init__ (self) :         self.head = None               def  is_empty (self) :         return  self.head == None           def  add (self, item) :         temp = Node(item)         temp.set_next(self.head)         self.head = temp          def  length (self) :         current = self.head         count = 0          while  current != None :             count = count + 1              current = current.get_next()         return  count          def  search (self, item) :         current = self.head         found = False          while  current != None  and  not  found:             if  current.get_data() == item:                 fount = True              else :                 current = current.get_next()                  return  found 
有序列表 有序列表中元素的相对位置取决于他们的基本特征,通常以升序或者降序排列,并且元素间能进行有意义的比较。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 class  OrderedList :    def  __init__ (self) :         self.head = None           def  is_empty (self) :         return  self.head == None           def  length (self) :         current = self.head         count = 0          while  current != None :             count = count + 1              current = current.get_next()         return  count          def  search (self, item) :         current = self.head         found = False          stop = False          while  current != None  and  not  found and  not  stop:             if  current.get_data() == item:                 found = True              else :                 if  current.get_data() > item:                     stop = True                  else :                     current = current.get_next()                      return  found          def  add (self, item) :         current = self.head         pervious = None          stop = False          while  current != None  and  not  stop:             if  current.get_data() > item:                 stop = True              else :                 previous = current                 current = current.get_next()                  temp = Node(item)         if  previous == None :             temp.set_next(self.head)             self.head = temp         else :             temp.set_next(current)             previous.set_next(temp)