字符串(堆分配存储)11种操作的实现

来源:互联网 发布:php常用函数有哪几个 编辑:程序博客网 时间:2024/05/21 09:01

操作

时间复杂度(T(n))

空间复杂度(S(n))

判断是否为空

O(1)

O(1)

得到长度

O(1)

O(1)

清空字符串

O(1)

O(1)

比较两个字符串         (长度分别为m,n)

O(min(m,n))

O(1)

比较两个字符串         (长度分别为m,n)

O(n)

O(n)

在字符串1中查找字符串2(长度分别为m,n)

O((m-n+1)*n^2)

O(m-n+1):字符串1中最多有m-n+1个长度为n的子字符串

O(n):截取一个长度为n的子字符串

O(n):比较两个长度均为n的字符串

O((m-n+1)*n)

O(m-n+1):字符串1中最多有m-n+1个长度为n的子字符串

O(n):截取一个长度为n的子字符串

截取子字符串

O(n):表示是线性的,下同

O(n)

插入字符串

O(n)

O(n)

删除字符串

O(n)

O(n)

/*   数据结构分析与学习专栏*  Copyright (c) 2015, 山东大学计算机科学与技术专业学生*  All rights reserved.*   作    者:   高祥*   完成日期:  2015 年 4 月 7 日*   版 本 号:014 *任务描述:针对字符串,实现15个基本操作*   1:建立字符串*   2:输出字符串*   3:判断字符串是否为空*   4:求字符串的长度*   5:清空字符串*   6: 比较两个字符串的大小*   7:连接两个字符串并将结果返回到第一个字符串中*   8:在字符串1中查找字符串2出现第一次的首字符的索引*   9:输出字符串的某一子字符串*  10:在当前字符串中的某位置插入另一个字符串*  11:在当前字符串中的某位置删除一个字符串 *主要函数:*  1.void StringAssign(String &str,char *chars);//创建字符串*  2.void Output(String str);//输出字符串*  3.Status IsEmpty(String str);//判断字符串是否为空*  4.void StringLength(String str);//求字符串的长度*  5.void ClearString(String &str);//清空字符串*  6.Status StringCompare(String str1,String str2);//比较两个字符串的大小*  7.void ContactString(String &str1,String &str2);//连接两个字符串*  8.void IndexOfString(String str1,String str2);//求字符串2在字符串1中第一次出现的首字符位置索引*  9.String SubString(String str,int pos,int length);//截取子字符串并返回*  10.void StringInsert(String &str1,String str2,int pos);//在字符串1中位置为POS处插入字符串2*  11.void StringDelete(String &str,int pos,int length);//在字符串中删除索引从POS起,长度为length的子字符串*/#include<iostream>#include<cstdlib>using namespace std; #define OK 1#define FALSE 0#define EQUAL 0#define BIG 1#define SMALL -1#define ERROR 2 typedef int Status; typedef struct{   char *ch;//若为非空串,则按照串长分配存储区;否则为空指针   int length;//串长} String; void StringAssign(String &str,char*chars);//创建字符串void Output(String str);//输出字符串Status IsEmpty(String str);//判断字符串是否为空void StringLength(String str);//求字符串的长度void ClearString(String &str);//清空字符串Status StringCompare(String str1,Stringstr2);//比较两个字符串的大小void ContactString(String &str1,String&str2);//连接两个字符串void IndexOfString(String str1,Stringstr2);//求字符串2在字符串1中第一次出现的首字符位置索引String SubString(String str,int pos,intlength);//截取子字符串并返回void StringInsert(String &str1,Stringstr2,int pos);//在字符串1中位置为POS处插入字符串2void StringDelete(String &str,intpos,int length);//在字符串中删除索引从POS起,长度为length的子字符串void Interaction(); int main(){   Interaction();   String str1,str2;   char chars[1000];    int operate;   while(cin>>operate)    {       switch(operate)       {       case 0:           return 0;        case 1:           cout<<"请输入要创建的字符串:";           cin.get();//读掉换行符            cin.getline(chars,1000);           StringAssign(str1,chars);           break;        case 2:           Output(str1);           break;        case 3:            if(IsEmpty(str1))           {                cout<<"字符串为空。\n";           }           else           {                cout<<"字符串不为空。\n";           }           break;        case 4:           StringLength(str1);           break;        case 5:           ClearString(str1);           cout<<"字符串清空成功。\n";           break;        case 6:           cout<<"请输入字符串2:";           cin.get();            cin.getline(chars,1000);           StringAssign(str2,chars);            int result;           result=StringCompare(str1,str2);//不能写成intresult=StringCompare(str1,str2);C++不允许在case中声明变量同时初始化            if(result==0)           {                cout<<"字符串1=字符串2。\n";           }           else if(result==1)           {                cout<<"字符串1>字符串2。\n";           }           else if(result==-1)           {                cout<<"字符串1<字符串2。\n";           }            ClearString(str2);           break;        case 7:           cout<<"请输入要连接的字符串:";           cin.get();            cin.getline(chars,1000);           StringAssign(str2,chars);            ContactString(str1,str2);           ClearString(str2);           break;        case 8:           cout<<"请输入要查找的字符串:";           cin.get();            cin.getline(chars,1000);           StringAssign(str2,chars);            IndexOfString(str1,str2);           ClearString(str2);           break;        case 9:           int pos,length;           cout<<"请输入要截取的子字符串的起始位置索引和长度:";           cin>>pos>>length;           if(pos<0||length<0||pos+length>str1.length)           {                cout<<"位置越界,无法截取。\n";                break;           }            Output(SubString(str1,pos,length));           break;        case 10:           cout<<"请输入要插入的字符串:";           cin.get();            cin.getline(chars,1000);           StringAssign(str2,chars);            cout<<"请输入要插入的位置索引(从0开始):";           cin>>pos;           StringInsert(str1,str2,pos);           ClearString(str2);           break;        case 11:           cout<<"请输入要删除的字符串的首字符的位置索引和删除的长度:";           cin>>pos>>length;            StringDelete(str1,pos,length);           break;        default:           cout<<"请输入正确的操作数字。\n";           break;       }    }    return 0;} void StringAssign(String &str,char*chars)//创建字符串{    if(str.ch)//释放str原有的空间    {       free(str.ch);    }    char *c=chars;//c是遍历器   int i;    for(i=0;*c; i++,c++);//求输入的字符串的长度:当*c==0时,字符串结束     if(!i)//空字符串    {       str.ch=NULL;//不分配内存,指向空指针       str.length=0;       cout<<"创建的字符串为:";       Output(str);       return;    }    str.ch=(char *)malloc(i*sizeof(char));   for(int j=0; j<i; j++)    {       str.ch[j]=chars[j];//复制    }   str.length=i;   cout<<"创建的字符串为:";   Output(str);} void Output(String str)//输出字符串{   if(!IsEmpty(str))    {       for(int i=0; i<str.length; i++)       {           cout<<str.ch[i];       }       cout<<endl;       return;    }    cout<<"字符串为空。\n";} Status IsEmpty(String str)//判断字符串是否为空{   if(str.length)    {       return FALSE;    }   return OK;} void StringLength(String str)//求字符串的长度{   cout<<"字符串的长度为:"<<str.length<<"\n";} void ClearString(String &str)//清空字符串{    if(str.ch)    {       free(str.ch);    }     str.ch=NULL;   str.length=0;} Status StringCompare(String str1,Stringstr2)//比较两个字符串的大小{   if(IsEmpty(str1)||IsEmpty(str2))    {       cout<<"字符串为空,无法比较。\n";       return ERROR;    }   //按照字典序比较   for(int i=0; i<str1.length&&i<str2.length; i++)    {       if(str1.ch[i]>str2.ch[i])       {           return BIG;       }       if(str1.ch[i]<str2.ch[i])       {           return SMALL;        }    }    if(str1.length>str2.length)    {       return BIG;    }   if(str1.length<str2.length)    {       return SMALL;    }   if(str1.length==str2.length)    {       return EQUAL;    }} void ContactString(String &str1,String&str2)//连接两个字符串{   StringInsert(str1,str2,str1.length);//调用插入字符串的函数:连接是插入的边界情况} void IndexOfString(String str1,Stringstr2)//求字符串2在字符串1中第一次出现的首字符位置索引{    if(str2.length>str1.length||IsEmpty(str2))//越界    {       cout<<"在第一个字符串中找不到第二个字符串。\n";        return;    }    for(int i=0; i<=str1.length-str2.length; i++)   //在不越界的前提下:依次将字符串1的每个长为str2.length的子字符串提取出来和字符串2进行比较    {       if(StringCompare(str2,SubString(str1,i,str2.length))==0)       {           cout<<"第二个字符串在第一个字符串中第一次出现的首字符索引为:"<<i<<endl;           return;       }    }   cout<<"在第一个字符串中找不到第二个字符串。\n";} String SubString(String str,int pos,intlength)//截取子字符串并返回{   String ReturnString;   ReturnString.ch=(char *)malloc(length*sizeof(char));   for(int i=0; i<length; i++)    {       ReturnString.ch[i]=str.ch[pos+i];    }   ReturnString.length=length;   return ReturnString;} void StringInsert(String &str1,Stringstr2,int pos)//在字符串1中位置为POS处插入字符串2{    if(pos<0||pos>str1.length)//越界    {       cout<<"插入位置越界。\n";       return;    }     str1.ch=(char*)realloc(str1.ch,(str1.length+str2.length)*sizeof(char));//重新分配内存   for(int i=str1.length+str2.length-1; i>=pos+str2.length; i--)//首先移动字符串1索引为POS至最后的字符    {       str1.ch[i]=str1.ch[i-str2.length];    }     for(int i=0; i<=str2.length-1; i++)//然后将字符串2复制到字符串1中    {       str1.ch[i+pos]=str2.ch[i];    }     str1.length=str1.length+str2.length;//更新长度   cout<<"新字符串为:";   Output(str1);} void StringDelete(String &str,intpos,int length)//在字符串中删除索引从POS起,长度为length的子字符串{    if(pos<0||length<0||pos+length>str.length)    {       cout<<"位置越界,无法删除。\n";       return;    }    for(int i=pos+length; i<str.length; i++)    {       str.ch[i-length]=str.ch[i];    }    str.ch=(char*)realloc(str.ch,(str.length-length)*sizeof(char));    str.length=str.length-length;   cout<<"新字符串为:";   Output(str);} void Interaction(){   cout<<"请输入对应操作的序号:\n";   cout<<"0:退出程序;\n";   cout<<"1:建立字符串;\n";   cout<<"2:输出字符串;\n";   cout<<"3:判断字符串是否为空;\n";   cout<<"4:求字符串的长度;\n";   cout<<"5:清空字符串;\n";   cout<<"6:比较两个字符串的大小;\n";   cout<<"7:连接两个字符串并将结果返回到第一个字符串中;\n";   cout<<"8:在字符串1中查找字符串2出现第一次的首字符的索引;\n";   cout<<"9:输出字符串的某一子字符串;\n";   cout<<"10:在当前字符串中的某位置插入另一个字符串;\n";   cout<<"11:在当前字符串中的某位置删除一个字符串;\n";   cout<<"注意:所有为位置索引从0开始。\n";}

0 0
原创粉丝点击