数据结构——串的定义与基本操作

/**
* 1.串的定义
*     串是由零个或多个字符组成的有限序列。
*     串中字符的个数称为串的长度,含有零个元素的串叫空串。
*     s =null;
*     s = “”;//empty
*     s = “ ”;//空格串
*     s = “Hello World 5201314!”;//常规串
*     串中任意连续字符组成的子序列称为该串的子串,包含子串的串称为主串。
* 2.串的存储结构
*     1)定长顺序存储表示
*     public class Str{
*          int MAX_STR_LEN = 255; //字符串最大长度
*         char[] chs = new char[MAX_STR_LEN+1];//字符数组
*      }
*     两种表示方法:0号单元存放数组长度,或者最后一个单元存放”\0”表示串的终结
*     2)堆分配存储表示
*     public class Str{
*          int length;//长度根据实际取值
*         char[] chs = new char[length+1];
*      }
*         Java取消了指针,故从代码上看,两种分配表示并不如C语言表示那样区别明显,
*     但是,实际上我个人觉得差别没那么大,定长是事先写死存储的容量,如果字符少,则
*     多余部分元素为null值,如果字符多,超过了容量,则会从前到后截取满足容量的字符,
*     之后的舍弃。变长表示则是根据传入字符数组的实际长度创建一样长度的字符数组。
*/

package string;

import java.util.Arrays;

/**
 * @author 芜情
 *   串的原子操作,由于变长实现的更加实用,以堆分配表示为例
 *   Java中定义好了String类型,这里模拟的是底层实现
 */
public class MyString {
    private int capacity;//字符串长度
    private char[] string;//字符数组
    //赋值
    public void strAssign(char[] chs){
        if(this.string != null){
            this.string = null;//释放原串空间
            this.capacity = 0;
        }
        if(chs == null){
            this.capacity = 0;
            this.string = null;
            return;
        }
        int len = chs.length;
        this.string = new char[len + 1];
        for(int i = 0; i < len; i++){
            string[i] = chs[i];
        }
        string[len] = '\0';
        this.capacity = len;
    }
    //取串长度
    public int strLength(){
        return this.capacity;
    }
    //串比较
    public boolean strCompare(MyString t){
        for(int i = 0; i < this.capacity && i < t.capacity; i++){
            if(this.string[i] != t.string[i]){
                return false;
            }
        }
        return this.capacity - t.capacity == 0;
    }
    //串连接
    public void concat(MyString t){
        int temp= this.capacity;
        int len = this.capacity + t.capacity;
        string = Arrays.copyOf(string, len + 1);
        for(int i =temp,  j = 0; i < len + 1; ++i, ++j){
            string[i] = t.string[j];
        }
        string[len] = '\0';
        this.capacity = len;
    }
    //求子串
    public MyString subString(int beginIndex, int len){
        if(beginIndex < 0 || beginIndex >= this.capacity || len <= 0 || len > this.capacity - beginIndex){
            throw new RuntimeException("索引错误");
        }
        MyString t = new MyString();
        t.capacity = len;
        t.string = new char[len +1];
        System.arraycopy(string, beginIndex, t.string, 0,len);
        string[len] = '\0';
        return t;
    }
    //串清空
    public void clear(){
        this.string = null;
        this.capacity = 0;
    }
    //重写toString方法,方便测试
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < this.capacity; i++){
            sb.append(string[i]);
        }
        return sb.toString();
    }
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值