字符串(堆分配存储)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
- 字符串(堆分配存储)11种操作的实现
- 数据结构:字符串的堆分配存储结构,基本操作实现和测试。
- 字符串的基本操作--基于堆分配存储
- 字符串的堆分配
- 串采用堆分配存储结构的基本操作
- 串的堆分配存储表示的C语言实现
- 堆分配存储的串的表示和实现
- 动态存储分配(堆分配)的顺序串与顺序表在操作上的异同
- C语言实现串的堆分配存储
- 串的堆分配存储
- 串的堆分配存储
- 串的堆分配存储
- 串的表示和实现(串的堆分配存储、串的定长顺序存储结构)
- C语言 堆形式存储的字符串操作
- 串的堆分配存储的连接
- 数据结构(C语言)读书笔记11:堆分配存储表示
- 打造自己的堆存储分配策略
- 打造自己的堆存储分配策略
- 【简单常用】nav view
- 数组的顺序存储表示和实现
- 严蔚敏《数据结构》书中错误纠正
- LeetCode - Validate Binary Search Tree
- 黑马程序员-JAVASE入门(泛型)
- 字符串(堆分配存储)11种操作的实现
- 字符串的定长顺序存储表示与块链存储表示
- ios 预留
- reverse a linked list
- poj 2352 树状数组
- 把web项目改造为maven项目
- java Log4j使用介绍
- can I win(judge first player to move can win)
- 杭电 HDU ACM 1708 Fibonacci String