【算法与数据结构2】抽象数据类型 双向链表等

1.创建一个空的链表:

class IntNote(object):
	"""docstring for IntNote"""
	def __init__(self,i,n):
		self.item=i
		self.next=n
		
class SLList(object):
	
	def __init__(self, x=None):
		if x is None:
			self.__first = None
			self.__size = 0
		else:
			self.__first = IntNote(x,None)
			self.__size
		
	def add_first(self,x):
		self.__size+=1
		self.__first=IntNote(x,self.__first)

	def add_last(self,x):
		self.__size+=1
		p=self.__first
		while p.next is not None:
			p=p.next
		p.next = IntNote(x,None)

	def size(self):
		return self.__size

class Intlist(object):
	def __init__(self,first,rest):
		self.first = first
		self.rest = rest

	def size(self):
		if self.rest is None:
			return 1
		else:
			return 1+self.rest.size()
	
	def iterative_size(self):
		p=self
		total_size=0
		while p is not None:
			total_size+=1
			p=p.rest
		return total_size

	def get(self,i):
		if i==0:
			return self.first
		else:
			return self.rest.get(i-1)

'''l=Intlist(5,None)
l=Intlist(10,l)
l=Intlist(15,l)
#print(l.size())\
#print(l.iterative_size())
print(l.get(0))'''

l=SLList()
#l.add_first(15)
l.add_last(10)

2.添加元素会出现问题:
输出:
AttributeError: 'NoneType' object has no attribute 'next'

def add_last(self,x):
		self.__size+=1
		p=self.__first
		while p.next is not None:
			p=p.next
		p.next = IntNote(x,None)

如何改进?
这里的本质问题是空链表和非空链表的第一个元素不一样
我们可以使用哨兵系统来解决
在这里插入图片描述
更改add last:

class IntNote(object):
	"""docstring for IntNote"""
	def __init__(self,i,n):
		self.item=i
		self.next=n
		
class SLList(object):
	#初始化,用户不填哨兵为1,用户填了就在哨兵后加一个
	def __init__(self, x=None):
		self.__sentinel = IntNote(76,None)  #哨兵76
		if x is None:
			self.__size = 0
		else:
			self.__sentinel.next = IntNote(x,None)
			self.__size = 1
		
	def add_first(self,x):
		self.__size+=1
		self.__first=IntNote(x,self.__first)

	def add_last(self,x):
		self.__size+=1
		p=self.__sentinel
		while p.next is not None:
			p=p.next
		p.next = IntNote(x,None)

	def size(self):
		return self.__size

class Intlist(object):
	def __init__(self,first,rest):
		self.first = first
		self.rest = rest

	def size(self):
		if self.rest is None:
			return 1
		else:
			return 1+self.rest.size()
	
	def iterative_size(self):
		p=self
		total_size=0
		while p is not None:
			total_size+=1
			p=p.rest
		return total_size

	def get(self,i):
		if i==0:
			return self.first
		else:
			return self.rest.get(i-1)

'''l=Intlist(5,None)
l=Intlist(10,l)
l=Intlist(15,l)
#print(l.size())\
#print(l.iterative_size())
print(l.get(0))'''

l=SLList()
#l.add_first(15)
l.add_last(10)

这样无论给不给元素都能正确运行

更改add first:

class IntNote(object):
	"""docstring for IntNote"""
	def __init__(self,i,n):
		self.item=i
		self.next=n
		
class SLList(object):
	#初始化,用户不填哨兵为1,用户填了就在哨兵后加一个
	def __init__(self, x=None):
		self.__sentinel = IntNote(76,None)  #哨兵76
		if x is None:
			self.__size = 0
		else:
			self.__sentinel.next = IntNote(x,None)
			self.__size = 1
		
	def add_first(self,x):
		original_first = self.__sentinel.next
		self.__sentinel.next = IntNote(x,original_first)
		self.__size +=1

	def add_last(self,x):
		self.__size+=1
		p=self.__sentinel
		while p.next is not None:
			p=p.next
		p.next = IntNote(x,None)

	def size(self):
		return self.__size

class Intlist(object):
	def __init__(self,first,rest):
		self.first = first
		self.rest = rest

	def size(self):
		if self.rest is None:
			return 1
		else:
			return 1+self.rest.size()
	
	def iterative_size(self):
		p=self
		total_size=0
		while p is not None:
			total_size+=1
			p=p.rest
		return total_size

	def get(self,i):
		if i==0:
			return self.first
		else:
			return self.rest.get(i-1)

'''l=Intlist(5,None)
l=Intlist(10,l)
l=Intlist(15,l)
#print(l.size())\
#print(l.iterative_size())
print(l.get(0))'''

l=SLList()
l.add_first(15)
l.add_last(10)

改进:目前把所有元素循环一遍才能向最后添加一个元素

双向链表

如果用缓存的方式,以下哪种或哪几种方法会很慢:
add_ last()
get_ last()
remove_ last()
答案:remove最慢 因为不知道前面有几个还是要遍历一遍

在这里插入图片描述
在这里插入图片描述
更简洁的方法:
在这里插入图片描述
更改add first:
在这里插入图片描述

	def add_first(self,x):
		self.__sentinel.next = IntNote(x,self.__sentinel.next,self.__sentinel) #更改3根线
		self.__sentinel.next.next.prev = self.__sentinel.next #1根线

		'''original_first = self.__sentinel.next
		new_first = IntNote(x,None,None)
		news_first.next = original_first
		new_first.prev = self.__sentinel
		self.__sentinel.next = new_first

		original_first.prev =news_first'''

同样可以改add last:

class IntNote(object):
	"""docstring for IntNote"""
	def __init__(self,i,n,p):
		self.item=i
		self.next=n
		self.prev=p

		
class SLList(object):
	def __init__(self, x=None):
		self.__sentinel = IntNote(76,None,None)  #哨兵76
		self.__sentinel.next = self.__sentinel
		self.__sentinel.prev = self.__sentinel
		self._last = self.__sentinel.prev
		if x is None:
			self.__size = 0
		else:
			self.__sentinel.next = IntNote(x,self.__sentinel,self.__sentinel)
			self.__sentinel.prev = self.__sentinel.next
			self.__size = 1
		
	def add_first(self,x):
		self.__sentinel.next = IntNote(x,self.__sentinel.next,self.__sentinel) #更改3根线
		self.__sentinel.next.next.prev = self.__sentinel.next #1根线
		self.__size+=1
		'''original_first = self.__sentinel.next
		new_first = IntNote(x,None,None)
		news_first.next = original_first
		new_first.prev = self.__sentinel
		self.__sentinel.next = new_first

		original_first.prev =news_first'''


	def add_last(self,x):
		self.__size+=1
		self.__sentinel.prev =IntNote(x,self.__sentinel,self.__sentinel.prev)
		self.__sentinel.prev.prev.next = self.__sentinel.prev

	def size(self):
		return self.__size

class Intlist(object):
	def __init__(self,first,rest):
		self.first = first
		self.rest = rest

	def size(self):
		if self.rest is None:
			return 1
		else:
			return 1+self.rest.size()
	
	def iterative_size(self):
		p=self
		total_size=0
		while p is not None:
			total_size+=1
			p=p.rest
		return total_size

	def get(self,i):
		if i==0:
			return self.first
		else:
			return self.rest.get(i-1)

'''l=Intlist(5,None)
l=Intlist(10,l)
l=Intlist(15,l)
#print(l.size())\
#print(l.iterative_size())
print(l.get(0))'''

l=SLList()
l.add_first(15)
l.add_last(10)

抽象数据类型
抽象数据类型(ADT) 仅由其操作定义,而不是由其实现定义。
是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是描述数据结构的一种理论工具,其目的是使人们能够独立于程序的实现细节来理解数据结构的特性。抽象数据类型的定义取决于它的一组逻辑特性,而与计算机内部如何表示无关。
栈结构
一个栈结构应该支持下面两个操作:
push(x): 将x放在栈的顶端
pop(): 将栈最上面的元素拿走并取出来得到它的值

先进后出,可以类比为搭积木或者上子弹

用列表实现:

class Stack(object):
	def __init__(self):
		self.__data = []

	def push(self,x):
		self.__data.append(x)

	def pop(self):
		return self.__data.pop()

s =Stack()
s.push(1)
s.push(2)
s.push(3)
s.push(4)
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())

输出:

4
3
2
1

扩展:实现一个字典;

class Set(object):
	"""docstring for Set"""
	def __init__(self, data=[]):
		self.__data = []
		for item in data:
			if item not in self.__data:
				self.__data.append(item)

	def add(self,x):
		if x not in self.__data:
			self.__data.append(x)

	def get_all(self):
		return self.__data

s=Set()
s.add(1)
s.add(2)
s.add(3)
s.add(3)
print(s.get_all())

输出:[1, 2, 3]

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值