4.1 串的顺序存储结构

Posted xlzfdddd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.1 串的顺序存储结构相关的知识,希望对你有一定的参考价值。

<?php
header("content-type:text/html;charset=utf-8");
class Linear_string{
    /**
     * 串的顺序存储结构的基本操作
     *
     *包括
     * 1.顺序串的初始化 __contruct()
     * 2.生成一个值等于字符串常量chars的串 strAssign()
     * 3.返回串的元素个数,即串的长度 strLength()
     * 4.返回串的自第pos个字符起长度为len的子串 subString()
     * 5.将string1和string2连接成一个新串 concat()
     * 6.比较两个串的大小,若string1>string2,则返回值>0;若string1=string2,则返回值=0;若string1<string2,则返回值<0 strCompare()
     * 7.在串的第pos个字符起长度为len的子串 strInsert()
     * 8.若主串中第pos个字符之后存在与string相等的子串,则返回串string在主串中第一次出现的位置 index()
     */

    private $string;
    private $length;
    //构造函数
    public function __construct($string)
    {
        $this->length =strlen($string);
        $this->string = $string;

    }
    //生成一个值等于字符串常量chars的串
    public function strAssign($chars=null){

        if(strlen($chars) > $this->length){
            echo "字符串长度过长";
            return false;
        }
        $this->string = substr($this->string,0,strlen($chars));//将初始字符串截断的和chars一样长
        for($i = 0;$i<strlen($chars);$i++){
            $this->length = strlen($chars);
            $this->string[$i] = $chars[$i] ;
        }

    }
    //返回串的元素个数,即串的长度
    public function strLength(){
        return $this->length;
    }

    //返回串的自第pos个字符起长度为len的子串
    public function subString($pos,$len){
        $sub = ‘‘;
        if($pos<0 || $pos>$this->length || $len<0 || $pos+$len>$this->length){
            echo "索引长度过长";
            return false;
        }else{
            for($i=$pos,$j=0;$i<$pos+$len;$i++,$j++){
                $sub[$j] = $this->string[$i];
            }
            $sub = implode("",$sub);
            return $sub;
        }
    }

    //将string1和string2连接成一个新串
    public function concat($string1,$string2){
        $totallength = $string1->length+$string2->length;
        if( $totallength<= $this->length){
            $this->string = substr($this->string,0,$totallength);
            $this->length = $totallength;
            for ($i = 0;$i<$string1->length;$i++){
                $this->string[$i] = $string1->string[$i];
            }
            for($i=0;$i<$string2->length;$i++){
                $this->string[$i+$string1->length] = $string2->string[$i];
            }
        }
    }

    //比较两个串的大小,若string1>string2,则返回值>0;若string1=string2,则返回值=0;若string1<string2,则返回值<0
    public function strCompare($string1,$string2){
        for($i=0;$i<$string1->length && $i<$string2->length;$i++){ //在两个串长度相同的部分内进行比较,若两串不相等则进行相减并退出循环,若两串则退出循环
            if($string1->string[$i]!=$string2->string[$i]){
                return (ord($string2->string[$i]) - ord($string1->string[$i]));
                break;
            }
        }
        return $string2->length - $string1->length;//退出循环证明两串长度相等部分的内容是一样的,而此时若长度不等,再进行相减,得出结果

    }

    //在串的第pos个字符起长度为len的子串
    public function strInsert($pos,$string){
        if($pos<0 || $pos>$this->length){
            echo "索引长度错误";
            return false;
        }

        $this->length += $string->length;
        for($i = $this->length;$i>=$pos;$i--){
            $this->string[$i+$string->length]=$this->string[$i];
        }
        for($i=$pos;$i<$pos+$string->length;$i++){
            $this->string[$i] = $string->string[$i-$pos];
        }

    }

    //从串的第pos个字符之前删除长度为len的子串
    public function strDelete($pos,$len){
        if($pos<0 || $pos>$this->length || $pos+$len>$this->length){
            echo "索引长度错误";
            return false;
        }

        for($i=$pos+$len;$i<$this->length;$i++){
            $this->string[$i-$len] = $this->string[$i];

        }
        $this->length -= $len;
        $this->string = substr($this->string,0,$this->length);
    }

    //若主串中第pos个字符之后存在与string相等的子串,则返回串string在主串中第一次出现的位置
    public function index($pos,$string){
        if($pos<0 || $pos>$this->length){
            echo "索引长度错误";
            return false;
        }

        $length = $this->length;
        $length_sub = $string->length;
        $i = $pos;
        while($i <$length-$length_sub+1){

            $sub = $this->subString($i,$length_sub);
            $sub = new Linear_string($sub);

            if($this->strCompare($sub,$string) != 0){

                ++$i;
            }else
                return $i;
        }
        return 0;
    }

}
?>

实现上述函数:

<?php
header("content-type:text/html;charset=utf-8");
include ‘linear_string.class.php‘;

$string = "xiaolinzifendoudediandi";
echo "初始化串:";
echo "</br>";
$linear_string = new Linear_string($string);
print_r($linear_string);
echo "</br>";
echo "</br>";

echo "获取2到5的子串:";
echo "</br>";
$sub = $linear_string->subString(2,5);
echo($sub);
echo "</br>";
echo "</br>";

echo "连接两个串lin和qinhua:";
echo "</br>";
$string1 = new Linear_string("lin");
$string2 = new Linear_string("qinhua");
$linear_string->concat($string1,$string2);
print_r($linear_string);
echo "</br>";
echo "</br>";

echo "比较两个串zuasha和zuashan的大小:";
echo "</br>";
$string1 = new Linear_string("zuasha");
$string2 = new Linear_string("zuashan");
$strcom = $linear_string->strCompare($string1,$string2);
echo($strcom);
echo "</br>";
echo "</br>";

echo "在索引3处插入一个子串xinru:";
echo "</br>";
$string = new Linear_string("xinru");
$linear_string->strInsert(3,$string);
print_r($linear_string);
echo "</br>";
echo "</br>";

echo "在索引3处删除一个长度为5的子串:";
echo "</br>";
$linear_string->strDelete(3,5);
print_r($linear_string);
echo "</br>";
echo "</br>";

echo "若主串中第3个字符之后存在与in相等的子串,则返回串in在主串中第一次出现的位置:";
echo "</br>";
$string = new Linear_string("in");
$index = $linear_string->index(3,$string);
echo  $index;
?>

最后的实现结果:

技术分享图片

以上是关于4.1 串的顺序存储结构的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记——串的基本知识(顺序存储结构实现串)

数据结构-串的定长顺序存储

数据结构(十五)串的顺序存储结构(顺序串)

串的数据结构表——顺序串与链式串

串的顺序存储结构

数据结构(C语言版)严蔚敏->串的定义(顺序存储堆分配存储块链存储)