数据结构之String
2015-07-17 23:12
316 查看
静态表示方法
串实际上是一个字符数组,一般第一位适用于存储字符串的长度,注意char c=2;实际上是对应存储的ASCII码,使用的时候需要直接传换成int型,int a=c就解决了。
动态表示
#include<iostream> using namespace std; #define MAXSTRLEN 255 #define TRUE 1 #define FALSE 0 #define Status int typedef unsigned char String[MAXSTRLEN]; Status StrAssign(String &T,char *chars);//创建串 Status StrEmpty(String S);//判断串是否为空 Status StrCompare(String S,String T);//比较串 Status StrCopy(String &S,String T);//复制串 int StrLength(String S);//返回串的长度 Status Concat(String &T,String S1,String S2);//连接串 Status SubString(String &Sub,String S,int pos,int length);//替换串 int Index(String S,String T,int pos); Status Replace(String &S,String T,String V); Status StrInsert(String &S,int pos,String T); Status StrDelete(String &S,int pos,int length); void StrPrint(String S); void DestoryString(String &S); int main() { String S; //测试赋值函数 if(StrAssign(S,"abcd")) { printf("赋值成功\n"); StrPrint(S); } //测试复制函数 char t[20]="I like coding"; String S1,T; StrAssign(T,t); if(StrCopy(S1,T)) { printf("复制成功!\n"); StrPrint(S1); } if(StrCompare(S,S1)) printf("S和S1相等\n"); else printf("S和S1不相等\n"); String temp=""; if(StrEmpty(temp)) printf("temp为空字符串\n"); else printf("temp不为空\n"); printf("s的长度为%d\n",StrLength(S)); String S2; if(Concat(S2,S,S1)) { printf("连接成功 "); StrPrint(S2); } String s,V,ss; StrAssign(s,"bc"); int pos=Index(S,s,1); printf("%d\n",pos); StrAssign(ss,"I am abcd haha ,you are a bitch"); StrAssign(V,"heor"); StrPrint(ss); if(Replace(ss,S,s)) { printf("替换成功!:\n"); StrPrint(ss); } //插入 StrInsert(ss,2,s); StrPrint(ss); StrDelete(ss,2,2); StrPrint(ss); return 0; } Status StrAssign(String &T,char *chars) { int m=strlen(chars); if(m>MAXSTRLEN)return FALSE; for(int i=0;i<m;i++) T[i+1]=chars[i]; T[0]=m; return TRUE; } Status StrEmpty(String S) { if(S[0]==0) return TRUE; return FALSE; } Status StrCompare(String S,String T) { int i=1; if(S[0]==T[0]) for(i=1;i<=S[0];i++) if(S[i]!=T[i]) break; int n=S[0]; if(i-1==n) return TRUE; return FALSE; } int StrLength(String S) { return S[0]; } Status StrCopy(String &S,String T) { S[0]=T[0]; for(int i=1;i<=S[0];i++) S[i]=T[i]; return TRUE; } Status Concat(String &T,String S1,String S2) { int uncut,i,j; if(S1[0]+S2[0]<=MAXSTRLEN)//如果没有截断 { T[0]=S1[0]+S2[0]; for(i=1;i<=S1[0];i++) T[i]=S1[i]; for(j=1;j<=S2[0];j++) T[j+i-1]=S2[j]; uncut=TRUE; } else if(S1[0]<MAXSTRLEN&&S1[0]+S2[0]>MAXSTRLEN)//部分截断 { T[0]=MAXSTRLEN; for(i=1;i<=S1[0];i++) T[i]=S1[i]; for(j=1;j+S1[0]<=MAXSTRLEN;j++) T[i++]=S2[j]; uncut=FALSE; } else if(S1[0]>=MAXSTRLEN) { int i; T[0]=MAXSTRLEN; for(i=1;i<=MAXSTRLEN;i++) T[i]=S1[i]; uncut=FALSE; } return uncut; } Status SubString(String &Sub,String S,int pos,int length) { int flag=0; int i; if(length>S[0]-pos+1)return FALSE; Sub[0]=length; for(i=1;i<=length;i++) Sub[i]=S[i+pos-1]; flag=1; return flag; } int Index(String S,String T,int pos) { int m,n,i; String sub; if(pos>0) { n=StrLength(S); m=StrLength(T); for(i=pos;i<=n-m+1;i++) { if(SubString(sub,S,i,m)) if(StrCompare(sub,T)) return i; } } return FALSE; } Status Replace(String &S,String T,String V) { int i,pos; if(S[0]<T[0]||S[0]<V[0])return FALSE; pos=Index(S,T,1); if(pos==0) { printf("替换错误!\n"); return FALSE; } else { if(T[0]==V[0]) for(i=pos;i<=V[0];i++) S[i]=V[i]; else if(T[0]<V[0]) { int length=V[0]-T[0]; for(i=S[0];i>=pos+length-1;i--) S[i+length]=S[i]; for(i=pos;i<=V[0];i++) S[i]=V[i]; } else if(T[0]>=V[0]) { int length = T[0]-V[0]; int n=StrLength(V); int m=StrLength(S); StrPrint(V); for(i=pos;i<=pos+n-1;i++) S[i]=V[i-pos+1]; for(;i<=m-length;i++) S[i]=S[i+length]; } } return TRUE; } Status StrInsert(String &S,int pos,String T) { int i,m,n; m=StrLength(T); n=StrLength(S); if(pos<=n) { for(i=n;i>=pos;i--) S[i+m]=S[i]; for(i=1;i<=m;i++) S[pos+i-1]=T[i]; } else { for(i=1;i<=m;i++) S[n+i]=T[i]; } return TRUE; } Status StrDelete(String &S,int pos,int length) { int m=StrLength(S); if(pos>m||length>m-pos+1)return FALSE; for(int i=pos;i<=m-length;i++) S[i]=S[i+length]; return TRUE; } void StrPrint(String S) { int n=S[0]; for(int i=1;i<=n;i++) printf("%c",S[i]); printf("\n"); }
串实际上是一个字符数组,一般第一位适用于存储字符串的长度,注意char c=2;实际上是对应存储的ASCII码,使用的时候需要直接传换成int型,int a=c就解决了。
动态表示
#include<iostream> #include<cstring> using namespace std; #define OK 1 #define ERROR 0 #define SSIZE 100 #define Status int #define OVERFLOW 0 typedef struct{ char *ch;//若为空串,按长度分配 int length; }HString; void StrInit(HString &S); Status StrAssign(HString &T,char *chars); int StrLength(HString S); int StrCompare(HString S,HString T); Status ClearString(HString &S); Status Concat(HString &S,HString S1,HString S2); HString SubString(HString S,int pos,int length); void StrPrint(HString S); int main() { int n; char a[100]="abc",b[100]="bcd"; HString S,T,SS; StrInit(S); StrInit(T); StrInit(SS); StrAssign(S,a); StrAssign(T,b); n=StrCompare(S,T); if(n>0) printf("S>H\n"); else if(n==0) printf("S=H\n"); else printf("S<H\n"); //连接操作 if(Concat(SS,S,T)) StrPrint(SS); else printf("连接失败!\n"); HString V; V=SubString(SS,1,3); StrPrint(V); return 0; } void StrInit(HString &S) { S.ch=NULL; S.length=0; } Status StrAssign(HString &T,char *chars) { int n; n=strlen(chars); if(T.ch)free(T.ch); if(n==0) { T.ch=NULL; T.length=0; } else { T.ch=(char*)malloc(n*sizeof(char)); if(!T.ch)exit(ERROR); for(int i=0;i<n;i++) T.ch[i]=chars[i]; T.length=n; } return OK; } int StrLength(HString S) { return S.length; } int StrCompare(HString S,HString T) { // if(strcmp(S,T)>0) //这种方法不行,因为字符串结尾没有终结符,所以不能够比较 // return 1; // else if(strcmp(S,T)==0) // return 0; // else // return -1; for(int i=0;i<S.length&&i<T.length;i++) if(S.ch[i]!=T.ch[i]) return S.ch[i]-T.ch[i]; return S.length-T.length; } Status ClearString(HString &S) { if(S.ch) { free(S.ch); S.ch=NULL; } S.length=0; return OK; } Status Concat(HString &S,HString S1,HString S2) { int i; if(S.ch)free(S.ch); S.ch=(char*)malloc((S1.length+S2.length)*sizeof(char)); if(!S.ch)return ERROR;//申请内存失败; S.length=S1.length+S1.length; for(i=0;i<S1.length;i++) S.ch[i]=S1.ch[i]; for(i=0;i<S2.length;i++) S.ch[i+S1.length]=S2.ch[i]; return OK; } HString SubString(HString S,int pos,int length) { HString T; StrInit(T); T.ch=(char*)malloc(length*sizeof(char)); if(pos+length+1>S.length)exit(0); for(int i=pos;i<pos+length;i++) T.ch[i-pos]=S.ch[i]; T.length=length; return T; } void StrPrint(HString S) { for(int i=0;i<S.length;i++) printf("%c",S.ch[i]); printf("\n"); }
相关文章推荐
- 数据结构之String
- 先序非递归遍历二叉树解析——面试高频数据结构
- 数据结构复习之栈和队列
- 课程笔记 03 :数据结构(清华) 向量
- C++学习之map类型 分类: 数据结构与算法 2015-07-17 15:07 11人阅读 评论(0) 收藏
- Java数据结构和算法的数组
- 课程笔记 04 :数据结构(清华) 向量-查找算法
- 常用数据结构STL实现(优先队列、队列、栈)
- 数据结构复习之线性表
- UVA11988 Broken Keyboard (a.k.a. Beiju Text)
- UVA 11136 Hoax or what 【multiset】
- 基本数据结构之Stack类(一)
- UVALive 4487 Exclusive-OR
- PAT 数据结构 06-图8. 关键活动(30)
- Java LinkedList特有方法程序小解 && 使用LinkedList 模拟一个堆栈或者队列数据结构。
- 数据结构进制转换源代码
- 数据结构赫夫曼树源程序
- 数据结构二叉树源程序
- 数据结构迷宫源程序
- 数据结构图的深度遍历和广度遍历源程序