【数据结构】【串】【课堂笔记】(含代码)

简介: 【数据结构】【串】【课堂笔记】(含代码)


串的基本概念

串是由0个或者多个字符组成的有限序列

记为:s="a11a2……an"

串与线性表的对比

串的逻辑结构:和线性表极为相似

区别:串的数据对象约定是字符集

串的基本操作:和线性表有很大区别

  • 线性表的基本操作:以单个元素为操作对象
  • 串的基本操作:以串的整体为操作对象

子串与主串

子串

由串中任意个连续的字符组成的子序列

主串

包含子串的串

字符位置

字符在序列中的序号(从1开始)

子串位置

子串的首字符在主串中的位置

串的基本操作

加工型

串复制:将某个串复制给当前串

串连接:将串S1和S2联接而成一个新串

串替换:用子串x替换当前串中的子串y

插入子串:将子串插到当前串中的某个位置

删除子串:从当前串中删除指定子串

大写转小写:将串中的大写字母转化为对应小写字符

小写转大写:将串中的小写字母转化为对应大写字符

串压缩:将当前串中首部和尾部的所有空格删除

引用型

判空:判断当前串是否为空

串比较:判断当前串与指定串是否相等

求串长:返回当前串的字符个数

求子串:返回串的第i个字符开始的长达k个字符的子串

子串定位:输出子串在当前串中首次出现的位置

串的顺序储存与实现

在串的顺序储存中,一般有三种方法表示串的长度

(1)用一个变量来表示串的长度

(2)在串尾储存一个特殊字符作为串的终结符

(3)用数组的0号存在串的长度

串的实现

顺序储存结构的串可以用字符数组来存储字符数据

串的初始化

public calss string{
    private int maxSize =10;//串中字符数组的初始长度
    private char[] chars;//存储元素的数组对象
    private int length;//保存串的当前长度
    public string(){}
    public string(int n){}
    public void copy(string t){}
    public boolean isEmpty(){}
    public int compare(string t){}
    public int getLength(){}
    ...//此处省略部分成员方法
}

getter and setter

public class string {
    private int maxSize =10;//串中字符数组的初始长度
    private char[] chars;//存储元素的数组对象
    private int length;//保存串的当前长度
    public string(){}
    public string(int n){
    }
    public void copy(string t){
    }
    public boolean isEmpty(){
        return length <= 0;
    }
    public int compare(string t){
        return -1;
    }
    public int getLength(){
        return length;
    }
    public int getMaxSize() {
        return maxSize;
    }
    public void setMaxSize(int maxSize) {
        this.maxSize = maxSize;
    }
    public char[] getChars() {
        return chars;
    }
    public void setChars(char[] chars) {
        this.chars = chars;
    }
    public void setLength(int length) {
        this.length = length;
    }
}

功能完善

import javax.xml.crypto.dsig.keyinfo.RetrievalMethod;
public class string {
    private int maxSize =10;//串中字符数组的初始长度
    private char[] chars;//存储元素的数组对象
    private int length;//保存串的当前长度
    //串的初始化
    //构造一个空串
    public string(){
    }
    //构造一个能保存n个字符串的串
    public string(int n){
    }
    public void copy(string t){
        //将串t复制给当前串
        if(this.maxSize<t.maxSize){
            this.maxSize=t.maxSize;
            this.chars = new char[this.maxSize];
        }
        this.length=0;//初始化当前串的长度
        for(int i=0;i<t.getLength();i++){
            this.chars[i]=t.chars[i];
            this.length++;
        }
    }
    public boolean isEmpty(){
        return length <= 0;
    }
    /**
     * compare 串比较
     * @param t 字符型
     * @return int型 | 若当前串等于串t,则返回值0;若当前串大于串t,则返回1;若当前串小于于串t,则返回-1
     * @author xrilang
     */
    public int compare(string t){
        int i = 0;
        while(this.chars[i]==t.chars[i] && i < this.length && i<t.getLength()){i++;}
        //若当前串等于串t,则返回值0
        if(i==this.length && i==t.length) return 0;
        //若当前串大于串t,则返回1
        else if(i==t.getLength() && i < this.length) return 1;
        //若当前串小于于串t,则返回-1
        else return -1;
    }
    /**
     * concat 串联结
     * @param t 字符型
     * @author 萌狼蓝天
     */
    public void concat(string t){
        if(this.maxSize<this.length+t.getLength()){
            //当前串容量不够,暂存到数组tempArr
            char[] tempArr = new char[this.length];
            for(int i=0;i<this.length;i++){
                tempArr[i]=this.chars[i];
            }
            //重设maxSize,使串容量满足需求
            this.maxSize = this.length+t.getLength();
            this.chars=new char[this.maxSize];
            //恢复当前串的原始状态
            for(int i=0;i<tempArr.length;i++){
                this.chars[i]=tempArr[i];
            }
        }
        for(int i=0;i<t.length;i++){
            this.chars[this.length]=t.chars[i];
            this.length++;
        }
    }
    /**
     * subString 求子串
     * @param pos int型 索引 所求子串起始位置,不能为负数
     * @param len int型 长度 所求子串的长度
     * @return string型 返回所求子串,如果不存在则返回null
     * @author 萌狼蓝天
     */
    public string subString(int pos,int len){
        if(pos<0) return null;
        if(pos+len>=this.length) {
            //从位置pos开始不存在长度为len的子串
            return null;
        }
        string temp = new string(len);
        for(int i=0;i<len;i++){
            temp.chars[i]=this.chars[pos+i];
            temp.length ++;
        }
        return temp;
    }
    public int getLength(){
        return length;
    }
    public int getMaxSize() {
        return maxSize;
    }
    public void setMaxSize(int maxSize) {
        this.maxSize = maxSize;
    }
    public char[] getChars() {
        return chars;
    }
    public void setChars(char[] chars) {
        this.chars = chars;
    }
    public void setLength(int length) {
        this.length = length;
    }
}


相关文章
|
1月前
|
算法 开发者 计算机视觉
燃爆全场!Python并查集:数据结构界的网红,让你的代码炫酷无比!
在编程的世界里,总有一些数据结构以其独特的魅力和高效的性能脱颖而出,成为众多开发者追捧的“网红”。今天,我们要介绍的这位明星,就是Python中的并查集(Union-Find)——它不仅在解决特定问题上大放异彩,更以其优雅的设计和强大的功能,让你的代码炫酷无比,燃爆全场!
32 0
|
4月前
|
算法 安全 大数据
揭秘!Python堆与优先队列:数据结构的秘密武器,让你的代码秒变高效战士!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue提供堆与优先队列功能,助你提升算法效率。堆用于快速找大数据集的第K大元素,如示例所示,时间复杂度O(n log k)。PriorityQueue在多线程中智能调度任务,如模拟下载管理器,按优先级处理任务。掌握这些工具,让代码运行更高效!
70 1
|
19天前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
25 1
|
29天前
|
存储 算法 索引
HashMap底层数据结构及其增put删remove查get方法的代码实现原理
HashMap 是基于数组 + 链表 + 红黑树实现的高效键值对存储结构。默认初始容量为16,负载因子为0.75。当存储元素超过容量 * 负载因子时,会进行扩容。HashMap 使用哈希算法计算键的索引位置,通过链表或红黑树解决哈希冲突,确保高效存取。插入、获取和删除操作的时间复杂度接近 O(1)。
27 0
|
1月前
05(数据结构考研)树相关操作代码
05(数据结构考研)树相关操作代码
27 0
|
1月前
|
算法
04(数据结构考研)串相关操作代码
04(数据结构考研)串相关操作代码
18 0
|
1月前
03(数据结构考研)队列相关操作代码
03(数据结构考研)队列相关操作代码
39 0
|
1月前
02(数据结构考研)栈相关操作代码
02(数据结构考研)栈相关操作代码
12 0
|
1月前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
53 0
|
1月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
18 0