• 数据结构与算法学习(二):栈和队列


    栈和队列

    一、栈

    1.栈的定义

    栈又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

    实现栈的顺序存储结构(常用)

    #栈的顺序存储结构
    class SeqStack(object):
    	def __init__(self,size):
    		self.data = list(None for _ in range(size))
    		self.max_size = size
    		self.top = -1
    	def get_length(self):
    		return self.top + 1
    	def push(self,elem):
    		#进栈
    		if self.top + 1 == self.max_size:
    			raise IndexError('Stack is full')
    		else:
    			self.top += 1
    			self.data[self.top] = elem
    	def pop(self):
    		#出栈
    		if self.top == -1:
    			raise IndexError('Stack is empty')
    		else:
    			self.top -= 1
    			return self.data[self.top + 1]
    	def get_top(self):
    		if self.top == -1:
    			raise IndexError("Stack is empty")
    		else:
    			return self.data[self.top]
    	def show_stack(self):
    		j = self.top
    		while j >= 0:
    			print(self.data[j])
    			j -= 1
    	def is_empty_stack(self):
    		return self.top == -1
    if __name__  == '__main__':
    	s = SeqStack(10)
    	s.push(11)
    	s.push(22)
    	s.push(33)
    	s.show_stack()
    	print('===========')
    	print(s.get_top())
    	print(s.get_length())
    

      

    实现栈的链式存储结构

    #栈的链式存储结构
    class Node(object):
    	def __init__(self,data=None):
    		self.data = data
    		self.next = None
    class LKStack(object):
    	def __init__(self):
    		self.top = Node(None)
    		self.count = 0
    	def get_length(self):
    		return self.count
    	def get_top(self):
    		return self.top.data
    	def is_empty(self):
    		return self.count == 0
    	def push(self,elem):
    		tmp = Node(elem)
    		if self.is_empty():
    			self.top = tmp
    		else:
    			tmp.next = self.top
    			self.top = tmp
    		self.count += 1
    	def pop(self):
    		if self.is_empty():
    			raise IndexError('Stack is empty')
    		else:
    			self.count -= 1
    			elem = self.top.data
    			self.top = self.top.next
    			return elem
    	def show_stack(self):
    		if self.is_empty():
    			raise IndexError('Satck is empty')
    		else:
    			j = self.count
    			tmp = self.top
    			while j > 0 and tmp:
    				print(tmp.data)
    				tmp = tmp.next
    				j -= 1
    
    if __name__ == '__main__':
    	s = LKStack()
    	s.push(11)
    	s.push(22)
    	s.push(33)
    	s.push(44)
    	s.show_stack()
    	print('================')
    	print(s.get_length())
    	s.pop()
    	print(s.get_top())
    

      

    二、队列

    定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

     

    链表实现队列:头部删除和查看O(1),尾部删除O(1)

    #链表实现队列
    class Node(object):
    	def __init__(self,elem=None):
    		self.next = None
    		self.elem = elem
    
    class Queue(object):
    	def __init__(self):
    		self.head = None
    		self.rear = None
    	def isEmpty(self):
    		return self.head is None
    	def peek(self):
    		if self.isEmpty():
    			return None
    		return self.head.elem 
    	def enqueue(self,elem):
    		n = Node(elem)
    		if self.head == None:
    			self.head = n
    			self.rear = self.head
    		else:
    			self.rear.next = n
    			self.rear = n
    	def dequeue(self):
    		if self.head == None:
    			return None
    		else:
    			tmp = self.head.elem
    			self.head = self.head.next
    		return tmp
    	def allDequeue(self):
    		List = []
    		while self.head != None:
    			List.append(self.head.elem)
    			self.head = self.head.next
    		return List
    
    if __name__ == '__main__':
    	q = Queue()
    	q.enqueue(11)
    	q.enqueue(13)
    	q.enqueue(14)
    	q.enqueue(15)
    	print(q.peek())
    	print(q.dequeue())
    	print(q.allDequeue())
    

      

  • 相关阅读:
    eclipse中字母大小写转换快捷键
    Java中删除文件、删除目录及目录下所有文件
    request.getRequestDispatcher()和response.sendRedirect()
    hibernate4 二级缓存demo实例
    Srping整合EhCache
    收集的几个好用的maven mirror
    Hibernate所用15个jar包
    DRUID连接池的使用
    no persistent classes found for query class: FROM com.vrv.paw.domain.User
    正向代理和反向代理
  • 原文地址:https://www.cnblogs.com/wangxiayun/p/8483513.html
Copyright © 2020-2023  润新知