数据结构学习的简单问题(四):用队列自己实现String类
2013-04-12 21:35 liuzq2013 阅读(167) 评论(0) 收藏 举报用队列自己实现String类,要求实现赋值,字符串拼接,求子串,字符串模式匹配,判断两字符串是否相等等功能。对队列的拷贝构造函数理解不够深,一开始犯了大错!
头文件如下:
struct StringNode{ char data; StringNode *link; StringNode(char d,StringNode* L=NULL){ data=d;link=L;} }; class String{ private: StringNode *front,*rear; public: String(){front=NULL;rear=NULL;} String(char a){ StringNode* newNode=new StringNode(a); front=newNode;rear=newNode; } String(string& a); String(char* a,int n); String(const String& L);//一开始写错了!! ~String(){delete front;delete rear;} StringNode* getFront()const{return front;} StringNode* getRear()const{return rear;} void setFront(StringNode* cur){front=rear;} void setRear(StringNode* cur){rear=cur;} int length()const; StringNode* Locate(int i)const; void get(char a); bool put(char& a); String subString(const int start,const int end);//和开始时拷贝构造函数的写法一样犯了大错 friend String& StrBind(String& a,String& b); int posOfSubStr(const String& p); friend bool operator ==(const String& L1,const String& L2); char operator [](int i)const; }; void String::get(char a){ StringNode* newNode=new StringNode(a); if(rear!=NULL){ rear->link=newNode;rear=newNode;} else{ front=newNode; rear=newNode;} }; bool String::put(char& a){ if(front==NULL){ return false;} StringNode* del=front; a=front->data; front=front->link; delete del; return true; }; String::String(char* a,int n){ StringNode* newNode=new StringNode(a[0]); front=newNode;rear=newNode; for(int i=1;i<n;i++) get(a[i]); }; String::String(string& a){ StringNode* newNode=new StringNode(a[0]); front=newNode;rear=newNode; int len=a.length(); for(int i=1;i<len;i++){ get(a[i]);} }; int String::length()const{ int count=0; StringNode* cur=front; while(cur!=NULL){ cur=cur->link;count++;} return count; }; StringNode* String::Locate(int i)const{ if(i<1||i>length()||front==NULL){return NULL;} StringNode* cur=front; for(int j=1;j<i;j++){ cur=cur->link;} return cur; }; char String::operator [](int i)const{ StringNode* cur=Locate(i+1); return cur->data; }; String::String(const String& L){ StringNode* srcptr=L.getFront(); if(srcptr==NULL) {front=0;rear=0;} else{ char v=srcptr->data;//important! StringNode* newNode=new StringNode(v); front=newNode; rear=newNode; while(srcptr->link!=NULL){ srcptr=srcptr->link; v=srcptr->data; get(v);} } }; String String::subString(int start,int end){ String current; if(start>end||start<1||start>length()||end<1||end>length()){return current;} int count=end-start; StringNode* old=Locate(start); char v=old->data;//important! String sub(v);//important! for(int i=0;i<count;i++){ old=old->link; v=old->data; sub.get(v); } return sub; }; String& StrBind(String& a,String& b){ StringNode* r=a.getRear(); StringNode* f=b.getFront(); r->link=f; return a; }; int String::posOfSubStr(const String& p){ String a=*this; int m=p.length(); int n=a.length(); int j=0,i=0,pos=0; while(pos<n-m+1) { if(p[j]==a[i]) { if(j==m-1) return pos; j++;i++; } else { j=0;pos++;i=pos; } } return -1; }; bool operator ==(const String& L1,const String& L2){ if(L1.length()!=L2.length()) return false; int j=L1.length(); for(int i=0;i<j;i++){ if(L1[i]!=L2[i]) return false; } return true; };
测试文件:
#include <iostream> using namespace std; #include "String.h" int main(){ string aa="Hello",bb="World!"; String a(aa),b(bb); cout<<"a="<<aa<<","<<"a的长度为"<<a.length()<<endl<<"b="<<bb<<","<<"b的长度为"<<b.length()<<endl; StrBind(a,b); cout<<"调用StrBind()函数后,a="<<(aa+bb)<<"a的长度为"<<a.length()<<endl; String c=b.subString(2,4); cout<<"c=b.subString(2,4);c="; //cout<<c.length()<<endl; for(int i=0;i<c.length();i++){ cout<<c[i]; } cout<<";c的长度为"<<c.length()<<endl; string dd="llo"; String d(dd); cout<<"d="<<dd<<","<<"d的长度为"<<d.length()<<endl; cout<<"在a的第"<<a.posOfSubStr(d)<<"个位置匹配到d!"<<endl; cout<<"d==c的结果为:"<<(d==c)<<endl; string ee="llo"; String e(ee); cout<<"e="<<ee<<","<<"e的长度为"<<e.length()<<endl; cout<<"d==e的结果为:"<<(d==e)<<endl; }
运行结果:

浙公网安备 33010602011771号