代码改变世界

数据结构学习的简单问题(四):用队列自己实现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;
}

运行结果: