1. 程式人生 > >資料結構--串的操作基本實現程式代…

資料結構--串的操作基本實現程式代…

#include

#include

#include

#include

#include

#define Maxsize 200

enum returninfo{success,fail,overflow,underflow,range_error};//定義返回資訊清單

class cstring

{

private:

char name[Maxsize];

public:

cstring();

~cstring();

bool strcreat(char *string);//串建立

bool randow();//隨機產生字串

void strtraverse();//串遍歷

int strlength();//

求串長度

cstring & operator =(char *string);//串賦值

cstring & operator (char *string);//串連線

char *substr(int locate,int len);//求子串

bool strcompare(char *string);//串比較

int strindex(char *string);//子串定位

returninfo strinsert(int locate,char *string);//串插入

returninfo strdelete(int locate,int len);//串刪除

returninfo strmodify(int locate,int len,char *string);//

修改字串

bool strreplace(char *string1,char *string2);//串替換

void strresolve();//串的分解

void statistics();//字元的統計

bool compare(int num,char data);

};

cstring::cstring()

{

name[0]='\0';

}

cstring::~cstring(){}

//串建立

bool cstring::strcreat(char *string)

{

int i=0;

if(strlen(string)>=Maxsize)

return false;

else

{

strcpy(name,string);//呼叫庫函式

return true;

}

}

//隨機產生字串

bool cstring:: randow()

{

int number;

srand((unsigned int)time(NULL));

cout<<"請輸入字串的長度: ";

cin>>number;

if(number>=Maxsize)

return false;

else{

for(int i=0;i

{

name[i 1]='\0';

name[i]=rand()� 33;//產生隨機字元的ASCII

}

return true;

}

}

//串遍歷

void cstring::strtraverse()

{

if(name[0]!='\0')

cout<<name<<endl;

else

cout<<"字串為空!"<<endl;

}

//求串長度

int cstring::strlength()

{

return strlen(name);

}

//串賦值

cstring &cstring::operator =(char *string)//定義過載字元 =

{

strcpy(name,string);//呼叫庫函式

return (*this);

}

//串連線

cstring &cstring:: operator (char *string)//定義過載字元

{

strcat(name,string);

return (*this);

}

//求子串

char *cstring::substr(int locate,int len)

{

char *temp;

int n=0,i;

temp=new char(len 1);

if(name[0]!='\0')

{

for(i=locate-1;(i-locate)<(len-1);i )

{

temp[n 1]='\0';

temp[n ]=name[i];

}

return temp;

}

else

return NULL;

}

//串比較

bool cstring::strcompare(char *string)

{

if(strcmp(name,string)==0)

return true;

else

return false;

}

//子串定位

int cstring::strindex(char *string)

{

int n=0,locate=0,i;

char *searchp;

for(searchp=name;(*searchp)!='\0';searchp )

{

locate ;

n=0;

for(i=0;i<(int)strlen(string);i )

if(*(string i)==*(searchp i))

n ;

if(n==(int)strlen(string))

break;

}

if((*searchp)=='\0')

locate=-1;

return locate;

}

//串插入

returninfo cstring::strinsert(int locate,char *string)

{

int i,n;

char *searchp=string;

n=strlen(string);

if(strlen(name) n>=Maxsize)

return overflow;

else if(locate>(cstring::strlength() 1)||locate<0)

return range_error;

else

{

for(i=(cstring::strlength());i>=locate-1;i--)//先後移

name[i n]=name[i];

for(i=(locate-1);(i-locate)再覆蓋

name[i]=*(searchp );

return success;

}

}

//串刪除

returninfo cstring::strdelete(int locate,int len)

{

if(len>=Maxsize)

return overflow;

else if(locate>=cstring::strlength()||locate<0)

return range_error;

else

{

for(int i=(locate-1);i<=cstring::strlength();i )//直接覆蓋

name[i]=name[i len];

return success;

}

}

//串替換

bool cstring::strreplace(char *string1,char *string2)

{

int n=0;

char *searchp=name,*temp,*followp;

while(*searchp!='\0')

{

followp=searchp;

if(*followp==(*string1))

{

for(temp=string1;*temp!='\0';temp )

if(*temp!=*(followp )) break;

if(*temp=='\0')

{

n ;

cstring::strdelete((searchp-name 1),strlen(string1));//先刪除

cstring::strinsert((searchp-name 1),string2);//再插入

searchp=searchp strlen(string2)-1;

if((searchp-name)>=strlen(name))

break;

continue;

}

}

searchp ;

}

if(n>0)

return true;

else

return false;

}

//修改字串

returninfo cstring::strmodify(int locate,int len,char *string)

{

if(len strlen(name)>=Maxsize)

return overflow;

else if(locate>=cstring::strlength()||locate<0)

return range_error;

else

{

cstring::strdelete(locate,len);//先刪除

cstring::strinsert(locate,string);//再插入

return success;

}

}

//串的分解

void cstring::strresolve()

{

int sum=0,n=0;

char temp[50],*searchp;

if(name[0]!='\0')

{

for(searchp=name;(*searchp)!='\0';searchp )

{

if(*searchp>='0'&&(*searchp)<='9')

sum=sum*10 (*searchp)-'0';

else{

temp[n 1]='\0';

temp[n ]=*searchp;

}

}

cout<<"分解的整數為: "<<sum<<endl;

cout<<"分解的字元為: "<<temp<<endl;

}

else

cout<<"字串為空!"<<endl;

}

//字元的統計

bool cstring::compare(int num,char data)

{

for(int i=0;i

if(name[i]==data)

break;

if(i==num)

return 1;

else

return 0;

}

void cstring::statistics()

{

int m=0;

if(name[0]!='\0')

{

for(int i=0;i

{

m=0;

for(int j=0;j

if(name[j]==name[i]&&compare(i,name[i]))

m ;

if(m>0)

cout<<"字元 "<<name[i]<<"的個數為: "<<m<<endl;

}

}

else

cout<<"字串為空!"<<endl;

}

void show_menu()

{

cout<<"=============選單============="<<endl

<<"=============================="<<endl

<<" 1.建立字串"<<endl

<<" 2.遍歷字串"<<endl

<<" 3.求串長度"<<endl

<<" 4.覆蓋重新整理"<<endl

<<" 5.串連線"<<endl

<<" 6.求子串"<<endl

<<" 7.串比較"<<endl

<<" 8.子串定位"<<endl

<<" 9.串插入"<<endl

<<" a.串刪除"<<endl

<<" b.替換"<<endl

<<" c.修改"<<endl

<<" d.分解"<<endl

<<" e.統計"<<endl

<<" 0.退出"<<endl

<<"=========================="<<endl

<<"請輸入選擇: ";

}

int main()

{

char choice,temp[20],newchar[20];

int locate,length,choose;

returninfo infor;

cstring newstring;

while(1)

{

show_menu();

cin>>choice;

switch(choice)

{

case '1':

cout<<endl<<"1.手工輸入 2.隨機產生"<<endl;

cin>>choose;

bool tf;

if(choose==1)

{

cout<<"請輸入字串: ";

cin>>temp;

tf=newstring.strcreat(temp);

}

else

tf=newstring.randow();

if(tf)

cout<<"建立成功!"<<endl;

else

cout<<"建立失敗!"<<endl;

break;

case '2':

cout<<"字串為: ";

newstring.strtraverse();

break;

case '3':

cout<<"字串長度為: ";

cout<<newstring.strlength()<<endl;

break;

case '4':

cout<<"請輸入新的字串: ";

cin>>temp;

if(strlen(temp)>=Maxsize)

cout<<"長度過大,賦值失敗!"<<endl;

else

{

newstring=temp;

cout<<"賦值成功!"<<endl;

}

break;

case '5':

cout<<"請輸入需要連線的字串: ";

cin>>temp;

if((newstring.strlength() strlen(temp))>=Maxsize)

cout<<"長度過大,連線失敗!"<<endl;

else

{

newstring temp;

cout<<"連線成功!"<<endl;

}

break;

case '6':

cout<<"請輸入子串的位置: ";

cin>>locate;

cout<<"請輸入子串的長度: ";

cin>>length;

if(locate>0&&locate

{

strcpy(temp,newstring.substr(locate,length));

if(temp!=NULL)

cout<<"子串為: "<<temp<<endl;

else

cout<<"主字串為空!"<<endl;

}

else

cout<<"位置有誤!"<<endl;

break;

case '7':

cout<<"請輸入要比較的字串: ";

cin>>temp;

if(newstring.strcompare(temp))

cout<<"兩個字串相同!"<<endl;

else

cout<<"兩個字串不相同!"<<endl;

break;

case '8':

cout<<"請輸入子串: ";

cin>>temp;

locate=newstring.strindex(temp);

if(locate==-1)

cout<<"主字串中不存在這樣的子串!"<<endl;

else

cout<<"子串在主字串的位置為:"<<locate<<endl;

break;

case '9':

cout<<"請輸入要插入的字串: ";

cin>>temp;

cout<<"請輸入插入字串的位置: ";

cin>>locate;

infor=newstring.strinsert(locate,temp);

if(infor==overflow)

cout<<"字串過長,插入失敗!"<<endl;

else if(infor==range_error)

cout<<"位置不正確,插入失敗!"<<endl;

else

cout<<"插入成功!"<<endl;

break;

case 'a':

cout<<"請輸入要刪除的字串的起始位置: ";

cin>>locate;

cout<<"請輸入要刪除的字串的長度: ";

cin>>length;

infor=newstring.strdelete(locate,length);

if(infor==overflow)

cout<<"字串過長,刪除失敗!"<<endl;

else if(infor==range_error)

cout<<"位置不正確,刪除失敗!"<<endl;

else

cout<<"刪除成功!"<<endl;

break;

case 'b':

cout<<"請輸入要替換的字串: ";

cin>>temp;

cout<<"請輸入新的字串: ";

cin>>newchar;

if(newstring.strreplace(temp,newchar))

cout<<"替換成功!"<<endl;

else

cout<<"替換失敗!"<<endl;

break;

case 'c':

cout<<"請輸入要修改的字串的起始位置: ";

cin>>locate;

cout<<"請輸入要修改的字串的長度: ";

cin>>length;

cout<<"請輸入新的字串: ";

cin>>temp;

infor=newstring.strmodify(locate,length,temp);

if(infor==overflow)

cout<<"字串過長,修改失敗!"<<endl;

else if(infor==range_error)

cout<<"位置不正確,修改失敗!"<<endl;

else

cout<<"修改成功!"<<endl;

break;

case 'd':

newstring.strresolve();

break;

case 'e':

newstring.statistics();

break;

case '0':

exit(0);

default:

cout<<"輸入錯誤!"<<endl;

}

cout<<endl<<"請按任意鍵繼續。。。。"<<endl;

getch();

system("cls");

}

return 0;

}

相關推薦

資料結構--操作基本實現程式

#include #include #include #include #include #define Maxsize 200 enum returninfo{success,fai

資料結構基本操作--賦值,列印,連線

//#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string> #include<string.h> using namespac

資料結構--StringBuffer基本操作(JAVA)

StringBuffer和String類的區別是StringBuffer中的陣列有緩衝,所以不需要每次進行插入操作都重新申請陣列,提高了空間利用效率。這裡實現了一些StringBuffer的基本操作(幾個構造方法,查入和刪除操作)。 public class MyStrin

資料結構——棧操作實現

#include <stdio.h> #include <malloc.h> #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define TRUE 1 #define FALSE

案例3.2:括號匹配的檢驗(c++實現/資料結構/棧的基本操作

#include<iostream> #define MaxSize 100 #define OK 1 #define ERROR 0 using namespace std; typedef char ElemType; typedef int Status

資料結構C/C++程式碼實現 棧連結串列基本操作

實現棧連結串列基本操作: #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct linknode {     ElemType data;     stru

資料結構C/C++程式碼實現 順序表棧基本操作

順序表棧基本操作的實現  原始碼: #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; #define MAXSIZE 100 //#d

資料結構 圖的基本操作實現

實驗題目: 圖的基本操作實現        實驗環境:   Visual C++ 6.0                     實驗目的:掌握圖的鄰接矩陣和鄰接表兩個儲存結構及表示。           掌握圖的DFS和BFS兩種遍歷演算法。           理解並

資料結構 (鏈式儲存)的基本操作

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef struct {

演算法與資料結構-棧的基本操作C語言實現

序言 複習棧的基本操作及其C語言實現,主要以鏈式棧為例。 本文將介紹棧的以下基本操作: 棧的建立(順序棧和鏈式棧) 棧的初始化 棧遍歷 棧清空/銷燬 判斷棧是否為空 求棧的長度 返回並刪除棧頂元素 1. 棧建立 - 順序棧和鏈式棧 //順序棧的

資料結構---用順序表實現棧的基本操作

順序表實現棧    順序棧:棧的順序儲存結構,是利用一組地址連續的儲存單元依次存放自棧底到棧頂的資料元素,同時附設指標top指示棧頂元素在順序 棧中的位置。    棧在資料結構中也是一個比較重要的結構,它有一個重要的特性是:先進後出。先入棧的元素最後出棧。具

資料結構 (順序儲存)的基本操作

#include <stdio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSTRLEN 255 typedef

【C++資料結構】模版類實現雙迴圈連結串列的基本操作

單鏈表結構為我們提供方便分資料插入和刪除工作,美中不足的是查詢資料不方便,對於單鏈表查詢資料至少要遍歷一邊.  為此我們提出雙鏈表結構,從而方便的查詢資料. 給出雙鏈表的一般結構: 一種是帶頭結點(哨兵位)的管理方式,另一種是帶管理節點管理方式。 但是我們不建議採用

演算法與資料結構-佇列的基本操作C語言實現

序言 佇列有順序佇列和鏈式佇列,順序佇列通過陣列方式來實現,鏈式佇列通過連結串列方式來實現。 陣列方式實現便於資料訪問(大小和空間確定),連結串列方式實現便於資料操作(插入和刪除靈活)。 這裡介紹

基本資料結構――堆的基本概念及其操作

     轉載自:https://www.cnblogs.com/JVxie/p/4859889.html,同時感謝大佬的分析       在我剛聽到堆這個名詞的時候,我認為它是一堆東西的集合       但其實吧它是利用

資料結構 的順序表示和實現

上次寫鏈式串的時候就覺得太麻煩了,而且還不一定好用,今天就寫順序的果然方便很多。 寫的串是常用的字串以及一些常用函式。 全部自己原創的,如有不足還請指出。 #include <iostream> using namespace std; const int MAXN =

資料結構棧的基本操作

#include<iostream> #define MAXSIZE 100 #define OVERFLOW -1 #define OK 1 #define ERROR 0 using namespace std; typedef int SElemType

資料結構-鏈佇列基本操作

都是些基本操作,有興趣的可以看看。 1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct QNode { 4 int data; 5 struct QNode *next; 6 }QNod

Redis六種基本資料結構操作

一、String value是字串型別。 1.常用命令 set key value:設定key、value setex key seconds value:設定key、value,有效期seconds秒 setnx key value:設定key、v

資料結構——棧的基本操作(二進位制轉十進位制例項—c語言程式碼)

棧棧是一種重要的線性結構。棧必須通過線性表或者連結串列來實現,順序表點選開啟連結和連結串列點選開啟連結既可以向之前介紹的那樣獨立存在,同時它們也是一些特殊的資料結構(棧,佇列)的實現基礎。定義:棧是一個先進後出的線性表,只要求在表尾進行插入和刪除等操作,這是棧相對於連結串列和