データ構造ノート-スタックとキューpython

6815 ワード

概要
スタックとキューは、プログラム設計で広く応用されている2つの重要なデータ構造であり、いずれも特定の範囲のメモリセル内にデータを格納し、これらのデータは再取り出して使用することができ、線形テーブルに比べて、挿入と削除はより多くの制約を受け、限定的な線形テーブル構造とも呼ばれている.データ・アイテムのストレージとアクセスのみをサポートし、データ・アイテム間の関係はサポートしません.したがって,この2つのデータセットはいずれも小さく,簡単であり,その中で最も重要な操作は要素の格納と取り出しである.データ構造としては、構造の作成、空の状態であるかどうかを確認するなど、いくつかのデータ構造に必要な操作が必要です.
計算では,中間データオブジェクトの生成が早いか遅いか,時間的な前後順が存在する.これらの要素を後で使用する場合は、生成時間の順序も考慮する必要があります.
→スタックは,要素の後進先出(後進先出,Last In First Out,LIFO)関係を保証する構造である.
→キューは,要素の先進的な先出し(先入者が先に使用し,First In First Out)関係を保証する構造である.
 
1.スタック
スタックはコンテナで、データを格納したり、要素にアクセスしたり、要素を削除したりすることができます.スタックに格納された要素は互いに具体的な関係がなく、到来した時間の前後順しかありません.ここでは要素の位置,要素の前後順などの概念はない.スタックの基本的な性質は、いつでもアクセスでき、削除された要素は、その前の最後に格納された要素であることを保証します.したがって、スタックはデフォルト要素のアクセス順序を決定し、アクセス数は他の情報を必要としません.
 
1_1.スタックの抽象データ型の説明:

ADT Stack:
    Stack(self)    #    
    is_empty(self) #       ,    True    False
    push(self,e)   #   elem   ,       
    pop(self)      #                ,     
    top(self)      #           ,   

1_2.

, size, arr, arr[size], arr[size-1] , size , 。


#!/usr/bin/python
# -*- coding:utf-8 -*-  

#   
#   :     
class MyStack:
	__slots__ = ('items')#                
	#   
	def __init__(self):
		self.items = []
	#       
	def is_empty(self):
		return len(self.items)==0
	#      
	def size(self):
		return len((self.items))
	#      
	def top(self):
		if not self.is_empty():
			return self.items[len(self.items)-1]
		else:
			return None
	#  
	def pop(self):
		if len(self.items)>0:
			return self.items.pop()
		else:
			print('     ')
			return None
	#  
	def push(self,item):
		self.items.append(item)

if __name__ == "__main__":
	s = MyStack()
	s.push(4)
	s.push(3)
	s.push(2)
	s.push(1)
	print('    : '+str(s.top()))
	print('    : '+str(s.size()))
	s.pop()
	print('    ')

    : 1
    : 4
    
[Finished in 0.1s]

 

1_3.

, , , , 。 , next , next , , head.next.next , head.next.data 。


#   :    
class LNode:
	def __init__(self,x,next_=None):
		self.data = x
		self.next = next_

class MyStack:
	def __init__(self):
		#pHead=LNode()
		self.data = None
		self.next = None
	#  stack    ,     true,    false

	def empty(self):
		if self.next ==None:
			return True
		else:
			return False

	#        
	def size(self):
		size = 0
		p = self.next
		while p != None:
			p = p.next
			size += 1
		return size

	#  :    
	def push(self,e):
		p = LNode(e)
		p.next = self.next#None
		self.next = p

	def pop(self):
		tmp = self.next
		if tmp != None:
			self.next = tmp.next
			return tmp.data
		print('   ')
		return None

	def top(self):
		if self.next != None:
			return self.next.data
		print('   ')
		return None

if __name__ == '__main__':
	stack = MyStack()
	stack.push(4)
	stack.push(3)
	stack.push(2)
	stack.push(1)
	print('     : '+str(stack.top()))
	print('    : '+str(stack.size()))
	stack.pop()
	print('    ')

, LNode.


     : 1
    : 4
    
[Finished in 0.1s]

 

2.

, , , , 。 , , 。

2_1. :


ADT Queue:
    Queue(self)        #     
    is_empty(self)     #        ,   True    False
    enqueue(self,e)    #   elem    ,    
    dequeue(self)      #           ,    
    peek(self)         #           ,   

2_2.

front rear , rear , rear+, front+ 。


#!/usr/bin/python
# -*- coding:utf-8 -*-  

#   :    
class MyQueue:
	def __init__(self):
		self.arr = []
		self.front = 0#   
		self.rear = 0#   

	def isEmpty(self):
		return self.front == self.rear
	#       
	def size(self):
		return self.rear - self.front
	#       
	def getFront(self):
		if self.isEmpty():
			return None
		return self.arr[self.front]
	#      
	def getBack(self):
		if self.isEmpty():
			return None
		return self.arr[self.rear-1]
	#       
	def deQueue(self):
		if self.rear>self.front:
			self.front +=1
		else:
			print("    ")
	#      
	def enQueue(self,item):
		self.arr.append(item)
		self.rear += 1

if __name__ == '__main__':
	queue = MyQueue()
	queue.enQueue(1)
	queue.enQueue(2)
	print('     '+str(queue.getFront()))
	print('    '+str(queue.getBack()))
	print('    :'+str(queue.size()))

     1
    2
    :2
[Finished in 0.1s]

 

2_3.

, pHead pEnd , pEnd pEnd+1, pHead pHead.next.next, 。


#   :    
class LNode:
	def __init__(self,x,next_=None):
		self.data = x
		self.next = next_

class MyQueue:
	#     
	def __init__(self):
		self.pHead = None
		self.pEnd = None
	#        
	def isEmpty(self):
		if self.pHead == None:
			return True
		else:
			return False
	#      
	def size(self):
		size = 0
		p = self.pHead
		while p != None:
			p = p.next
			size += 1
		return size
	#   :       e
	def enQueue(self,e):
		p = LNode(e)
		p.next = None
		if self.pHead == None:
			self.pHead = self.pEnd = p
		else:
			self.pEnd.next = p
			self.pEnd = p
	#   
	def deQueue(self):
		if self.pHead == None:
			print("     ,    ")
		print('    :'+str(self.pHead.data))
		self.pHead = self.pHead.next
		if self.pHead == None:
			self.pEnd = None
	#       
	def getFront(self):
		if self.pHead == None:
			print("    ")
			return None
		return self.pHead.data
	#      
	def getBack(self):
		if self.pEnd == None:
			print("    ")
			return None
		return self.pEnd.data

if __name__ == "__main__":
	queue = MyQueue()
	queue.enQueue(1)
	queue.enQueue(2)
	print('     '+str(queue.getFront()))
	print('    '+str(queue.getBack()))
	print('    :'+str(queue.size()))

     1
    2
    :2
[Finished in 0.1s]