那位大虾给我一个String的标准的C++完全实现,不类似于M$的CString,注释要多一点!最好能照作数据结构书的那个写!主要是模式匹配KMP算法

aceplus 2001-05-11 07:08:00
加精
那位大虾给我一个String的标准的C++完全实现,不类似于M$的CString,注释要多一点!最好能照作数据结构书的那个写!主要是模式匹配KMP算法,
一个可移植的,平台无关的,可以说是一个纯学术性的! 


其实我是帮别人做毕业设计!大家知道,通常是5/20左右就答辩了,
时间太紧了!想请各位拉小弟一把,大致如下:
英文全文检索

首先建立一张常用词表(如a, it,the等),顺序扫描英文文件,分离单词,查找常用词表,若
不和表中的任一词相等,则为关键词,插入临时存放关键词的词表中.
接着建立索引表:从临时存放关键词的词表中读入一个关键词,插入索引表,对关键词词表
中的每一个关键词,在索引表中进行查找,并做相应的插入操作.重复以上操作,直至文件结束
.在索引表中查找关键词,实际上是字符串的匹配问题,如果索引表中已有此关键词的索引项
,则只需在该表中插入该词的具体位置;如果没有此关键词,则在索引表中插入此关键词项,插
入时应按字典的有序原则进行.
具体实现:
设定数据结构:关键词词表为线表,其数量有限,采用顺序存储结构,每个词是一个字符串.索
引表为有序表,且动态生成,生成过程需进行大量的插入操作,为提高效率,用折半查找,采用顺
序存储结构.
索引表中每个索引项包括两个内容:一是关键词,由于关键词常驻内存,应采用堆分配存储
表示的串类型;二是关键词的地址,由于关键词地址是在索引表的生成过程中逐个插入的,且不
同关键词的地址个数不等,甚至可能相差很远,宜采用链表结构的线性表,且最好采用双向链表

按照其老师的意思,主要考察模式匹配KMP算法,且这部分及String处理要独立出来,其他
都好说!要以VC做开发环境,而我一直用Delphi+数据库,没有过多的VC经验,且一看
数据结构书就恶心!

TO Kevin_qing(Kevin):
你写的那个,我是看懂了,可是“别人“却看不懂啦!虽然是学计算机的,
但是他却不是这块料,天天去法律系听课,尽管考研的时候铩羽而归,然而
却死心不改!!!

...全文
133 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jera 2001-06-28
  • 打赏
  • 举报
回复
playboy132 2001-06-28
  • 打赏
  • 举报
回复
先跟
aceplus 2001-05-12
  • 打赏
  • 举报
回复
提前
wjzhuang 2001-05-12
  • 打赏
  • 举报
回复
//.h
#ifndef _MY_STRING_H_
#define _MY_STRING_H_

#include <iostream.h>

/*
* The next line is used because Codewarrior has a conflict with
* the STL string. Make sure to put the #include of this file
* AFTER all the system includes.
*/
#define string String

class StringIndexOutOfBounds { };

class string
{
public:
string( const char *cstring = "" ); // Constructor
string( const string & str ); // Copy constructor
~string( ) // Destructor
{ delete [ ] buffer; }

const string & operator= ( const string & rhs ); // Copy
const string & operator+=( const string & rhs ); // Append

const char *c_str( ) const // Return C-style string
{ return buffer; }
int length( ) const // Return string length
{ return strLength; }

char operator[]( int k ) const; // Accessor operator[]
char & operator[]( int k ); // Mutator operator[]

enum { MAX_LENGTH = 1024 }; // Maximum length for input string
private:
char *buffer; // storage for characters
int strLength; // length of string (# of characters)
int bufferLength; // capacity of buffer
};

ostream & operator<<( ostream & out, const string & str ); // Output
istream & operator>>( istream & in, string & str ); // Input
istream & getline( istream & in, string & str ); // Read line

bool operator==( const string & lhs, const string & rhs ); // Compare ==
bool operator!=( const string & lhs, const string & rhs ); // Compare !=
bool operator< ( const string & lhs, const string & rhs ); // Compare <
bool operator<=( const string & lhs, const string & rhs ); // Compare <=
bool operator> ( const string & lhs, const string & rhs ); // Compare >
bool operator>=( const string & lhs, const string & rhs ); // Compare >=

#endif
//.cpp
#include <string.h>
#include "mystring.h"

string::string( const char * cstring )
{
if( cstring == NULL )
cstring = "";
strLength = strlen( cstring );
bufferLength = strLength + 1;
buffer = new char[ bufferLength ];
strcpy( buffer, cstring );
}

string::string( const string & str )
{
strLength = str.length( );
bufferLength = strLength + 1;
buffer = new char[ bufferLength ];
strcpy( buffer,str.buffer );
}

const string & string::operator=( const string & rhs )
{
if( this != &rhs )
{
if( bufferLength < rhs.length( ) + 1 )
{
delete [ ] buffer;
bufferLength = rhs.length( ) + 1;
buffer = new char[ bufferLength ];
}
strLength = rhs.length( );
strcpy( buffer, rhs.buffer );
}
return *this;
}

const string & string::operator+=( const string & rhs )
{
if( this == &rhs )
{
string copy( rhs );
return *this += copy;
}

int newLength = length( ) + rhs.length( );
if( newLength >= bufferLength )
{
bufferLength = 2 * ( newLength + 1 );

char *oldBuffer = buffer;
buffer = new char[ bufferLength ];
strcpy( buffer, oldBuffer );
delete [ ] oldBuffer;
}

strcpy( buffer + length( ), rhs.buffer );
strLength = newLength;
return *this;
}

char & string::operator[ ]( int k )
{
if( k < 0 || k >= strLength )
throw StringIndexOutOfBounds( );
return buffer[ k ];
}

char string::operator[ ]( int k ) const
{
if( k < 0 || k >= strLength )
throw StringIndexOutOfBounds( );
return buffer[ k ];
}

ostream & operator<<( ostream & out, const string & str )
{
return out << str.c_str();
}

istream & operator>>( istream & in, string & str )
{
char buf[ string::MAX_LENGTH + 1 ];
in >> buf;
str = buf;
return in;
}

istream & getline( istream & in, string & str )
{
char buf[ string::MAX_LENGTH + 1 ];
in.getline( buf, string::MAX_LENGTH );
str = buf;
return in;
}

bool operator==( const string & lhs, const string & rhs )
{
return strcmp( lhs.c_str( ), rhs.c_str( ) ) == 0;
}

bool operator!=( const string & lhs, const string & rhs )
{
return strcmp( lhs.c_str( ), rhs.c_str( ) ) != 0;
}

bool operator<( const string & lhs, const string & rhs )
{
return strcmp( lhs.c_str( ), rhs.c_str( ) ) < 0;
}

bool operator<=( const string & lhs, const string & rhs )
{
return strcmp( lhs.c_str( ), rhs.c_str( ) ) <= 0;
}

bool operator>( const string & lhs, const string & rhs )
{
return strcmp( lhs.c_str( ), rhs.c_str( ) ) > 0;
}

bool operator>=( const string & lhs, const string & rhs )
{
return strcmp( lhs.c_str( ), rhs.c_str( ) ) >= 0;
}
这是一个简单的类实现,让你扩展。模式匹配KMP算法可以参照数据结构的书自己写。不会难的
hello_wyq 2001-05-11
  • 打赏
  • 举报
回复
我在来捧场捧场一下,用c++的string木板类,在msdn中有相关的解释!
aceplus 2001-05-11
  • 打赏
  • 举报
回复
up

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧