数据结构:单链表结构字符串(python版)添加了三个新功能

时间:2022-09-27 22:04:09
 #!/urs/bin/env python
# -*- coding:utf-8 -*- #异常类
class stringTypeError(TypeError):
pass #节点类
class Node(object):
def __init__(self, elem, next_ = None):
self.elem = elem
self.next = next_
#单链表类
class single_list(object):
def __init__(self):
self._head = None
self._num = 0 def __len__(self):
return self._num def prepend(self,elem):
self._head = Node(elem, self._head)
self._num += 1 def append(self,elem):
if self._head is None:
self._head = Node(elem)
self._num += 1
return
p = self._head
while p.next:
p = p.next
p.next = Node(elem)
self._num += 1 def pop_last(self):
if self._head is None:
raise ValueError("in pop_last")
p = self._head
if p.next is None:
e = p.elem
self._head = None
self._num -= 1
return e
while p.next.next:
p = p.next
e = p.next.elem
p.next = None
self._num -= 1
return e def delitem(self, key):
if key == len(self)-1:
self.pop_last()
elif 0<= key < len(self) - 1:
p = self._head
pre = None
num = -1
while p is not None:
num += 1
if key==num:
if not pre:
self._head = p.next
self._num -= 1
else:
pre.next = p.next
self._num -= 1
break
else:
pre = p
p = p.next
else:
raise IndexError def insert(self, key, elem):
if key>=len(self)-1:
self.append(elem)
elif 0<=key<len(self)-1:
p = self._head
pre = None
num = -1
while p:
num += 1
if num==key:
if not pre:
self._head = Node(elem, self._head)
self._num += 1
else:
pre.next = Node(elem, pre.next)
self._num += 1
break
else:
pre = p
p = p.next
else:
raise IndexError # 打印显示
def printall(self):
p = self._head
while p:
print(p.elem, end="")
if p.next:
print(", ", end="")
p = p.next
print("") #单链表字符串类
class string(single_list):
def __init__(self, value):
self.value = str(value)
single_list.__init__(self)
for i in range(len(self.value)-1,-1,-1):
self.prepend(self.value[i]) def length(self):
return self._num #获取字符串对象值的列表,方便下面使用
def get_value_list(self):
l = []
p = self._head
while p:
l.append(p.elem)
p = p.next
return l def printall(self):
p = self._head
print("字符串结构:",end="")
while p:
print(p.elem, end="")
if p.next:
print("-->", end="")
p = p.next
print("") #朴素的串匹配算法,返回匹配的起始位置
def naive_matching(self, p): #self为目标字符串,t为要查找的字符串
if not isinstance(self, string) and not isinstance(p, string):
raise stringTypeError
m, n = p.length(), self.length()
i, j = 0, 0
while i < m and j < n:
if p.get_value_list()[i] == self.get_value_list()[j]:#字符相同,考虑下一对字符
i, j = i+1, j+1
else: #字符不同,考虑t中下一个位置
i, j = 0, j-i+1
if i == m: #i==m说明找到匹配,返回其下标
return j-i
return -1 #kmp匹配算法,返回匹配的起始位置
def matching_KMP(self, p):
j, i = 0, 0
n, m = self.length(), p.length()
while j < n and i < m:
if i == -1 or self.get_value_list()[j] == p.get_value_list()[i]:
j, i = j + 1, i + 1
else:
i = string.gen_next(p)[i]
if i == m:
return j - i
return -1 # 生成pnext表
@staticmethod
def gen_next(p):
i, k, m = 0, -1, p.length()
pnext = [-1] * m
while i < m - 1:
if k == -1 or p.get_value_list()[i] == p.get_value_list()[k]:
i, k = i + 1, k + 1
pnext[i] = k
else:
k = pnext[k]
return pnext #把old字符串出现的位置换成new字符串
def replace(self, old, new):
if not isinstance(self, string) and not isinstance(old, string) \
and not isinstance(new, string):
raise stringTypeError while self.matching_KMP(old) >= 0:
#删除匹配的旧字符串
start = self.matching_KMP(old)
print("依次发现的位置:",start)
for i in range(old.length()):
self.delitem(start)
#末尾情况下时append追加的,顺序为正;而前面的地方插入为前插;所以要分情况
if start<self.length():
for i in range(new.length()-1, -1, -1):
self.insert(start,new.value[i])
else:
for i in range(new.length()):
self.insert(start,new.value[i]) #self字符串里第一个属于字符串another的字符所在结点的位置
def find_in(self, another):
if not isinstance(self, string) and not isinstance(another, string):
raise TypeError
for i in range(self.length()):
if self.get_value_list()[i] in another.get_value_list():
return i
return -1 #没有发现 # self字符串里第一个不属于字符串another的字符所在结点的位置
def find_not_in(self, another):
if not isinstance(self, string) and not isinstance(another, string):
raise TypeError
for i in range(self.length()):
if self.get_value_list()[i] not in another.get_value_list():
return i
return -1 #没有发现 #从self里删除串another里的字符
def remove(self, another):
if not isinstance(self, string) and not isinstance(another, string):
raise TypeError
while self.find_in(another)>=0:
self.delitem(self.find_in(another)) if __name__=="__main__": a = string("aba")
print("字符串长度:",a.length())
a.printall()
b = string("abaaaabadaba")
print("字符串长度:", b.length())
b.printall()
print("朴素算法_匹配的起始位置:",b.naive_matching(a),end=" ")
print("KMP算法_匹配的起始位置:",b.matching_KMP(a))
c = string("xu")
print("==")
b.replace(a,c)
print("替换后的字符串是:")
b.printall()
print(b.get_value_list())
d = string("dfga")
print("第一个属于another字符的位置:",b.find_in(d))
e = string("ad")
print("第一个不属于another字符的位置:", b.find_not_in(e))
b.remove(e)
b.printall()

数据结构:单链表结构字符串(python版)添加了三个新功能的更多相关文章

  1. 数据结构:单链表结构字符串(python版)改进

    此篇文章的replace实现了字符串类的多次匹配,但依然有些不足. 因为python字符串对象为不变对象,所以replace方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...

  2. 数据结构:单链表结构字符串(python版)

    #!/urs/bin/env python # -*- coding:utf-8 -*- #异常类 class stringTypeError(TypeError): pass #节点类 class ...

  3. 数据结构:栈 顺序表方法和单链表方法(python版)

    #!/usr/bin/env python # -*- coding:utf-8 -*- class StackUnderflow(ValueError): pass #链表节点 class Node ...

  4. python实现数据结构单链表

    #python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...

  5. python算法与数据结构-单链表&lpar;38&rpar;

    一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...

  6. 数据结构之线性表(python版)

    数据结构之线性表(python版) 单链表 1.1  定义表节点 # 定义表节点 class LNode(): def __init__(self,elem,next = None): self.el ...

  7. C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...

  8. 数据结构——单链表java简易实现

    巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成  通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...

  9. 数据结构——单链表(singly linked list)

    /* singlyLinkedList.c */ /* 单链表 */ /* 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. */ #include <stdio ...

随机推荐

  1. 如何写出让hr一看就约你面试的简历&quest;

  2. Django views 中 View decorators

    decorators(装饰器) 1. require_http_methods 在django.views.decorators.http中,可以用来限制请求的权限. require_http_met ...

  3. 【Moqui业务逻辑翻译系列】Sales Representative Seeks Prospects and Opportunities 销售代表寻找期望合作对象和机会

    h1. Sales Representative Seeks Prospects and Opportunities 销售代表寻找期望合作对象和合作机会 h4. Ideas to incorporat ...

  4. Java8新特性-Lambda表达式

    1.  什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: ...

  5. 阻止浏览器冒泡事件,兼容firefox和ie

    //得到事件 function getEvent(){ if(window.event) {return window.event;} func=getEvent.caller; while(func ...

  6. UDP广播 与 TCP客户端 --服务端

    随着倒计时的响声,自觉无心工作,只想为祖国庆生. 最近有遇到过这样一个问题,将摄像头识别的行人,车辆实时显示在客户端中.有提供接口,会以Json的数据的形式将实时将识别的对象进行Post提交.所以我们 ...

  7. Python之路&lpar;第三十二篇&rpar; 网络编程:udp套接字、简单文件传输

    一.UDP套接字 服务端 # udp是无链接的,先启动哪一端都不会报错 # udp没有链接,与tcp相比没有链接循环,只有通讯循环 server = socket.socket(socket.AF_I ...

  8. Item 14&colon; 如果函数不会抛出异常就把它们声明为noexcept

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 在C++98中,异常规范(exception specificat ...

  9. 如何将 jar 包导入Maven 本地仓库

    案例:oracle jar包由于在maven 远程仓库中找不到,需要先将oracle jar 文件下载到本地,然后导入maven本地仓库,就可以通过 pom 进行依赖 例如:下载后的 jar 地址 D ...

  10. weakSelf 运用 strongSelf来解决block的循环引用

    SDWebImage 中有一段源码: #if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplication&qu ...