数据结构——串


前言

字符串一般简称为串。在早期的程序设计语言中就引进了串的概念,但其常常以常量的形式作为输入和输出的参数,并不参与运算。随着计算机语言的发展,其不再单单是常量。一个检索关键字就是一个字符串,如“计算机”、“数据结构”等。按关键字进行检索实际就是对字符串进行查找与匹配。

提示:以下是本篇文章正文内容,下面案例可供参考

一、串的概念

串(String)是零个或多个字符组成的有限序列。
一般记为:S=”a1a2…an” (n≥0)
n是串中字符的个数,称为串的长度,n=0时的串称为空串。

  1. 串中任意个连续的字符组成的子序列称为该串的子串。相对地包含子串的串称为主串。通常将字符在串中的序号称为该字符在串中的位置。

  2. 当且仅当两个串的值相等时,称这两个串是相等的。即只有当两个串的长度相等,并且每个对应位置的字符都相等时才相等。

  3. 由一个或多个空格字符组成的串,称为空格串,其长度为串中空格字符的个数。空白串即空串。

从逻辑关系上看,串是线性表的一种,但串的存储结构和基本操作有其特殊性。其和一般线性表的操作最大的区别在于:线性表的操作通常以线性表内的数据元素为查找对象,而串的操作则主要将串作为一个整体进行操作。

二、串的基本运算

1.求子串运算 subString(begin, end)

返回一个新字符串,它是此字符串的一个字符串。该子字符串从指定的begin处开始,知道索引为 end-1 处的字符

例: "commander”.substring(3,6)= " man "

2.串插入运算 insert(offset, str)

例: "chater”.insert(0, " rac ")= " racchater "

3.串删除运算 delete(begin, end)

例: "commander”.delete(3,6)= "comder "

4. 串比较运算 compareTo(str)

例: “cat”. compareTo(“ cate ”) <0

5.子串定位运算indexOf(str,beging)

返回指定字符串再此字符串第一次出现处的索引

例: " bcaabcaaabc", indexOf(" bca " ,0) =0
" bcaabcaaabc", indexOf(" bca " ,6) =-1

6.指定索引返回值运算charAt(int index)

返回指定索引处的char

例: " bcaabcaaabc", charAt(5) =c

1.示例–先写逻辑类

题目要求:运用串的线性存储结构和基本运算实现从所给字符串中第pos个字符开始查找,返回子串在主串S中的位置。并写一个可以判断两字符串是否相等的方法

先建一个 MyString 类

public class MyString {
	private char[] value;//声明一个数组
	private int count;//声明count记录数组的长度
	
	
	//构造一个空的数组对象
	public MyString() {
		value = new char[0];
		count =0;
	}
	//将输入的参数封装成一个整体对象 
	public MyString(String str) {
		 char[] charrary = str.toCharArray();
		value = charrary;
		count = charrary.length;
	}
	
	//重写 toString()方法 将数组对象的值 转为字符串类型便于判断
	@Override
	public String toString() {
		return  Arrays.toString(value) ;
	}

然后写一个charAt方法和返回长度的方法

/返回指定所以处的charpublic char charAt(int index) {
		if(index<0||(index>=count)) {
			throw new StringIndexOutOfBoundsException(index);
		}
		return value[index];
		
	}
	//返回数组长度
	public int length() {
		return count;
	}

在写返回索引和判断的方法

//返回指定字符串再此字符串第一次出现处的索引
	public int indexOf(MyString substr,int start) {
		int i = start,j=0,v;
		//this 指的是 主串 
		//在字符串长度范围内进行查找
		while(i<this.length()&&j<substr.length()) {
			//返回从主串第i个开始的值和子串0位置的值进行对比
			//相等则继续向下比较
			if(this.charAt(i)==substr.charAt(j)) {
				i++;
				j++;
			}
			else {
				i=i+1;
				j=0;
			}
		}
		
		if(j==substr.length()) {
			v=i-substr.length();
			
		}
		else {
			v=-1;
		}
		return v;
	}
	
	//判断两字符串是否相等
	public static void check(MyString a,MyString b) {
		if(a.toString().equals(b.toString())) {
			System.out.println("两字符相等");
		}
		else {
			System.out.println("两字符不相等");
		}

2.测试类

public class Test2 {

	public static void main(String[] args) {
		MyString m = new MyString();
		MyString ms = new MyString("cddcdc");
		MyString ms1 = new MyString("cddcdc");
		MyString mt= new MyString("cdc");
	
		System.out.println("位置是:"+ms.indexOf(mt,0));
	
	m.check(ms, ms1);

	}

}

3.结果

[c, d, c] 的在主字符串[c, d, d, c, d, c]位置是:3
两字符相等

总结

这里最后我要说的是关于toString()方法重写的问题。在课堂上写的时候,说要判断两字符串是否相等。
一开始我想的是建一个方法含两个形参String,然后再在测试类中调用。结果发现两个参数不是String类型的,而是MyString类对象。
接着我就修改为拿两形式参数的value进行比较,为此还Source了Get和Set方法,结果发现还是不对。拿的是两对象的地址。
最后我就重写的了toString()方法,让其返回的类型可以作比较。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值