1. 程式人生 > >4.1 串的順序存儲結構

4.1 串的順序存儲結構

vat 存儲結構 private 構造 ras imp 錯誤 http 結果

<?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 串的順序存儲結構