数据结构之串——顺序存储结构(php代码实现)
admin
2023-06-29 22:44:30
0次
/**
1. StrToArr(): 将字符串转化为数组
2. StrCopy(): 字符串的拷贝(深拷贝,即重新申请一块新的内存来存储数据)
3. StrEmpty(): 字符串是否为空
4. StrCompare($cmpStr): 比较两个字符串的大小,如果大于,返回大于零的值;如果小于,返回小于零的值;如果等于,返回等于零的值。
5. StrLength(): 返回字符串的长度
6. ClearString(): 将字符串置为空串
7. Concat($conStr): 联接两个字符串
8. SubString($pos,$len): 返回字符串自pos个字符起,长度为len的字串。若不存在返回空串
9. Index($substr,$pos=0): 返回字串在主串中第pos个字符之后的位置。若不存在返回空串
10. StrInsert($subStr,$pos): 在主串指定的位置pos之前插入子串
11. StrDelete($pos,$len): 删除主串第pos位置起,长度为len的子串
12. Replace($subStr,$repStr): 使用repStr替换主串中的subStr

注:编程,其实编的都是对存储在内存中的数据的四个基本操作,即增,删,改,查。这与数据库的CURD操作基本一样。而比较比较复杂的操作也只不过是结合这四个基本操作来完成的。所以,掌握数据的存储结构,也就掌握了最根本的编程技巧。
*/


class SqStr{
   public $str;//保存字符串的数组
   private $length;//字符串的长度


   public function __construct($str=''){
       $this->str=$str;
       $this->length=strlen($str);
   }

   //将字符串转化为数组
   public function StrToArr(){
       $arr=array();
       for($i=0;$i<$this->length;$i++){
           $arr[]=$this->str[$i];
       }
       return $arr;
   }

   //字符串的拷贝(深拷贝,即重新申请一块新的内存来存储数据)
   public function StrCopy(){
       $string=(clone $this);
       return $string->str;
   }

   //字符串是否为空
   public function StrEmpty(){
       if($this->length==0){
           return 'Null';
       }else{
           return 'No Null';
       }
   }

   //比较两个字符串的大小,如果大于,返回大于零的值;如果小于,返回小于零的值;如果等于,返回等于零的值。
   public function StrCompare($cmpStr){
       error_reporting(E_ALL ^ E_NOTICE);
       for($i=0;$i<$this->length || $i            $str1=ord($this->str[$i]);
           $str2=ord($cmpStr[$i]);
           if($str1 != $str2){
               return $str1 - $str2;
           }
       }
       return '0';
   }

   //返回字符串的长度
   public function StrLength(){
       return $this->length;
   }

   //将字符串置为空串
   public function ClearString(){
       $this->str='';
       $this->length=0;
   }

   //联接两个字符串
   public function Concat($conStr){
       $this->length+=strlen($conStr);
       return $this->str.$conStr;
   }

   //返回字符串自pos个字符起,长度为len的字串。若不存在返回空串
   public function SubString($pos,$len){
       $othLen=$this->length - $pos + 1;
       $str='';
       for($i=$pos;$i<$this->length && $pos>0 && $othLen>$len && $i-$pos<$len;$i++){
           $str.=$this->str[$i-1];
       }
       return $str;
   }
   //或者
   public function SubString2($pos,$len){
       $othLen=$this->length - $pos + 1;
       $str='';
       if($pos<=0 || $pos>$this->length || $len<0 || $len>$othLen){
           return 'ERROR';
       }
       for($i=0;$i<$len;$i++){
           $str.=$this->str[$pos+$i-1];
       }
       return $str;
   }

   //返回字串在主串中第pos个字符之后的位置。若不存在返回空串
   public function Index($substr,$pos=0){
       $sublen=strlen($substr);
       if($pos<0 || $pos>$this->length || $substr ==''){
//            return 'ERROR';
           return 0;
       }
       $i=$pos;
       $j=0;
       while($i<$this->length&&$j<$sublen){
           if($this->str[$i]==$substr[$j]){
               $i++;
               $j++;
           }else{
               $i=$i-$j+1; //之所以这写,是因为子串在不相等的条件下,分为两种情况,第一、子串与主串完全不相等,此时的$j始终为0,而$i则每次递增一;第二、子串与主串部分相等,此时子串$j的增量与主串$i的增量相同,因此增加后$i与$j相减再加一的结果,就相当于原来的$i加一,直到$i=$this->length-1为止。
               $j=0;
           }
       }
       if($j==$sublen){  //当$j与字串的长度相等时,才说明主串中有与子串相等的字串
           return $i-$sublen+1;
       }else{
           return 0;
//            return 'ERROR';
       }
   }

   //在主串指定的位置pos之前插入子串
   public function StrInsert($subStr,$pos){
       if($pos<1 || $pos>$this->length+1){
           return 'ERROR';
       }
       $beforeStr=$afterStr='';//$beforeStr表示插入位置之前的子串
                               //$afterStr表示插入位置之后的子串
       for($i=0;$i<$pos-1;$i++){
           $beforeStr.=$this->str[$i];
       }
       for($i=$pos-1;$i<$this->length;$i++){   //之所以$i=$pos-1,其一是因为$pos的取值范围是从1 到 $this->length,而字串的下标是从0 到 $this->length-1
           $afterStr.=$this->str[$i];
       }
       $this->str=$beforeStr.$subStr.$afterStr;
       $this->length=strlen($this->str);
       return $this->str;
   }

   //删除主串第pos位置起,长度为len的子串
   public function StrDelete($pos,$len){
       if($pos<1 || $pos>$this->length || $len<0){
           return 'ERROR';
       }

       $beforeStr=$afterStr='';//$beforeStr表示删除位置之前的子串
                               //$afterStr表示删除位置之后的子串
       for($i=0;$i<$pos-1;$i++){  //之所以要$i<$pos-1,是因为此处是要取得$pos之前的元素,即字串下标为$pos-1之前的元素,因此要减一。
           $beforeStr.=$this->str[$i];
       }
       for($i=$pos+$len-1;$i<$this->length;$i++){ //$i=$pos+$len-1 表示要删除子串之后一个位置的下标
           $afterStr.=$this->str[$i];
       }
       $this->str=$beforeStr.$afterStr;
       $this->length=strlen($this->str);
       return $this->str;
   }

   //使用repStr替换主串中的subStr
   public function Replace($subStr,$repStr){
       $i=0;
       do{
           $i=$this->Index($subStr,$i);
           if($i){
               //所谓的替换,从存储结构上来讲就是先删除原来的,再从原来的位置插入新的。
               $this->StrDelete($i,strlen($subStr));
               $this->StrInsert($repStr,$i);
           }
       }while($i);
       return $this->str;
   }
}


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...