資料結構之,資料結構之數組

來源:互聯網
上載者:User

資料結構之,資料結構之數組

  簡單的實現串的操作,其實這與那些字串庫函數所用的操作思想是相同的,但是這是一種資料的儲存方式,與操作,重點強調了資料的儲存.


下面是串的非堆儲存操作,說明白就是穿類似數組的儲存,在分配記憶體時在棧中分配:

/**********************************************************************   * *   Copyright (c)2015,WK Studios * *   Filename:  str.h* *   Compiler: GCC  vc 6.0  * *   Author:WK   * *   Time: 2015 25 5 * **********************************************************************/ #pragma once#include<iostream>using namespace std;#include<assert.h>#define MAX_STR_LEN 20typedef char SString[MAX_STR_LEN+2];//首元素放串的長度,再給'\0'空間//1.產生一個值為s的串ssbool StrAssign(SString ss,char *s);//2.複製串s得到串ssbool StrCopy(SString ss,SString s);//一.字串拷貝,返回新字串的首地址char *my_strcpy(char *d, const char *str);//3.判空bool StrEmpty(SString ss);//4.比較字串int StrCompare(SString ss,SString s);//二.字串比較size_t my_strcmp(const char *d,const char *str);//5.求串長度size_t StrLength(SString ss);//三.求字串長度(在使用傳回值時可以強制類型轉換將無符號轉換為有符號進行運算)size_t my_strlen(const char *str);//6.把字串s1和s2聯結成新串ssbool Concat(SString ss,SString s1,SString s2);//四.字串串連,返回新串的首地址char *my_strcat(char *d,const char *str);//7. 返回串ss從pos位置起長度為len的子串並用數組sub儲存bool SubString(SString sub,SString ss,size_t pos,size_t len);//8.返回從ss串pos位置開始與c串有相同的子串出現的位置(只返回第一次出現的相同子串)size_t Index(SString ss,SString c,size_t pos);//9.用串v替換ss串中和c串相等的子串bool Replace (SString ss,SString c,SString v);//10.在串ss的第pos個字元前面插入串cbool StrInsert(SString ss,size_t pos,SString c);//11.刪除串ss中第pos個字元開始長度為len 的字串bool StrDelete(SString ss,size_t pos,size_t len);//12.銷毀刪除串ssbool DestoryString(SString ss);//13.顯示串void StrPrint(SString ss);

/**********************************************************************   * *   Copyright (c)2015,WK Studios * *   Filename:  str.cpp* *   Compiler: GCC  vc 6.0  * *   Author:WK   * *   Time: 2015 25 5 * **********************************************************************/ #include"str.h"//1.產生一個值為s的串ssbool StrAssign(SString ss,char *s){assert(strlen(s)<=MAX_STR_LEN);//超過就放不下ss[0]=strlen(s);//字串長度放在首元素for(int i=1;i<=ss[0];++i){ss[i]=s[i-1];}ss[ss[0]+1]='\0';//保證有字串的'\0'標識return true;}//2.複製串s得到串ssbool StrCopy(SString ss,SString s){//assert(ss[0]>s[0]);沒必要判斷,因為初始化的時候已經判斷了    for(int i=0;i<=s[0];++i){ss[i]=s[i];}ss[ss[0]+1]='\0';//保證有字串的'\0'標識return true;}//一.字串拷貝,返回新字串的首地址char *my_strcpy(char *d, const char *str);//3.判空bool StrEmpty(SString ss){return ss[0]==0;}//4.比較字串int StrCompare(SString ss,SString s){int i=1;for(;i<=ss[0]&&i<=s[0];++i){if(ss[i] != s[i]){return ss[i]-s[i];}}if(i>ss[0] || i>s[0])//兩個串長度不相等時候{return ss[i]-s[i];}return ss[0]-s[0];//兩個串相等的時候}//二.字串比較size_t my_strcmp(const char *d,const char *str);//5.求串長度size_t StrLength(SString ss){return ss[0];}//三.求字串長度(在使用傳回值時可以強制類型轉換將無符號轉換為有符號進行運算)size_t my_strlen(const char *str);//6.把字串s1和s2聯結成新串ssbool Concat(SString ss,SString s1,SString s2){if(s1[0]+s2[0]<=MAX_STR_LEN){ss[0]=s1[0]+s2[0];for(int i=1;i<=s1[0];++i){ss[i]=s1[i];}for(int j=1;j<=s2[0];++j){ss[s1[0]+j]=s2[j];}}else//超過後,放入s1截斷s2或者s2無機會放入{ss[0]=MAX_STR_LEN;for(int i=1;i<=MAX_STR_LEN;++i){ss[i]=s1[i];if(s1[0]< MAX_STR_LEN){ss[s1[0]+1]=s2[i];}}}ss[s1[0]+s2[0]+1]='\0';//保證有字串的'\0'標識return  true;}//四.字串串連,返回新串的首地址char *my_strcat(char *d,const char *str);//7. 返回串ss從pos位置起長度為len的子串並用數組sub儲存bool SubString(SString sub,SString ss,size_t pos,size_t len){if(pos<1 || pos>ss[0] ||len<1|| len > ss[0]-pos+1)//當pos=0時候就直接輸出數原字串  //長度與位置關係應考慮到加一{return false;}sub[0]=len;for(int i=0;i<len;++i){sub[i+1]=ss[pos+i];}return true;}//8.返回從ss串pos位置開始與c串有相同的子串出現的位置(只返回第一次出現的相同子串)size_t Index(SString ss,SString c,size_t pos){assert( pos <=ss[0] && c[0] <=ss[0] );    int i=pos;int j=1;while(i<=ss[0] && j<=c[0]){if(ss[i]==c[j]){i++;j++;}else{i=i-j+2; //從串ss的下一個字元開始比較j=1;//串c又從開頭開始進行比較}}    if(j>c[0])//說明比較完畢{return i-c[0];//返回c字串在ss中首元素出現的位置}return 0;//沒找到}//9.用串v替換ss串中和c串相等的子串bool Replace (SString ss,SString c,SString v){return true;}//10.在串ss的第pos個字元前面插入串cbool StrInsert(SString ss,size_t pos,SString c){   for(int i=ss[0]+1;i>=pos;--i)//往後移動時,連'\0'一塊進行移動   {   int a=c[0];   if(ss[0]+ c[0] > MAX_STR_LEN)   {    a=MAX_STR_LEN-ss[0];   }     ss[i+a]= ss[i];      }   int j=0,r=ss[0];   while( j<=c[0] )   {  if(ss[0]+ c[0] > MAX_STR_LEN)  {  if(r<MAX_STR_LEN)//c串部分插入  {     r++;  }  else  {  break;  }   }    ss[pos+j]=c[j+1]; //c串全部插入  j++;   }   if(ss[0]+ c[0]<=MAX_STR_LEN)//確定插入後串的長度   {   ss[0]+=c[0];   }   else{ss[0]=MAX_STR_LEN;}   return true;}//11.刪除串ss中第pos個字元開始長度為len 的字串bool StrDelete(SString ss,size_t pos,size_t len){       if(pos<1  ||  pos>ss[0]-len +1||  len<1)     return false;     for(int i=pos+len;i<=ss[0];i++)     ss[i-len]=ss[i];     ss[0]-=len;return true;}//12.銷毀刪除串ssbool DestoryString(SString ss){ss[0]=0;return true;}//13.顯示串void StrPrint(SString ss){for(int i=1;i<=ss[0];++i){cout<<ss[i]<<" ";}cout<<"\n";}

/**********************************************************************   * *   Copyright (c)2015,WK Studios * *   Filename:  main.cpp* *   Compiler: GCC  vc 6.0  * *   Author:WK   * *   Time: 2015 25 5 * **********************************************************************/ //測試函數#include"str.h"int main(){SString s1;char a1[]="123456";StrAssign(s1, a1);cout<<"s1 is: ";    StrPrint(s1);    cout<<"\n";SString s2;    char a2[]="123456789900009900";StrAssign(s2, a2);    cout<<"s2 is: ";    StrPrint(s2);    cout<<"\n";          cout<<"After Insert:";     StrInsert(s1,2,s2);      StrPrint(s1);cout<<"\n";       cout<<"After Delete:";StrDelete(s1,3,4);StrPrint(s1);cout<<"\n";/*cout<<Index(s1, s2, 4)<<"\n";  //substring 函數測試SString sub;SubString(sub,s1,1, 3);cout<<"sub is: ";StrPrint(sub);cout<<"\n";  //串連測試  SString ss;  Concat(ss,s1,s2);  cout<<"After concat ss is: ";  StrPrint(ss);  cout<<"\n";  //複製測試  StrCopy(s1,s2);  cout<<"After copy s1 is: ";  StrPrint(s1);  cout<<"\n";  //比較測試  cout<<"result of compare s1 with s2 is : ";  if(StrCompare(s1,s2)!= 0)  {  if(StrCompare(s1,s2) > 0)  cout<<"s1 大 \n";  else  cout<<"s2 大 \n";  }  else  {  cout<<"相等 \n";}*/return 0;}








待續:串的堆儲存操作》》》》》》》》》》》》》

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.