您的位置:首页 > 理论基础 > 数据结构算法

c++代码之-------动态数据结构

2012-09-05 21:09 323 查看
//IStack.h
#include <iostream>
#include <cassert>

class Link
{
public:
Link(Link* pnext,int id):pNext(pnext),_id(id){}
Link* Next() const {return pNext;}
int Id() const {return _id;}
private:
Link* pNext;
int _id;
};
class List
{
public:
List():pHead(0){}
~List(){
while(pHead!=0){
Link* temp=pHead;
pHead=pHead->Next();
delete temp;
}
}
void Add(int id){
Link* temp=new Link(pHead,id);
pHead=temp;
}
const Link* GetHead() const {return pHead;}
private:
Link* pHead;
};
class HTable
{
public:
const List& Find(const char* str) const
{
int i=hash(str);
return _list[i];
}
void Add(const char* str,int id) {
int i=hash(str);
_list[i].Add(id);
}
private:
int hash(const char* str) const{
assert(str!=0&&str[0]!=0);
unsigned h=str[0];
for(int i=1;i!=std::strlen(str);i++)
h=(h<<4)+str[i];
return h%sizeHTableSize;
}
static const int sizeHTableSize=127;
List _list[sizeHTableSize];
};
class StringBuffer
{
public:
StringBuffer():_curOffset(0){}
bool WillFit(int len) const{
return _curOffset+len+1<maxBufferSize;
}
void Add(const char *str){
assert(WillFit(std::strlen(str)));
std::strcpy(&_buffer[_curOffset],str);
_curOffset=_curOffset+std::strlen(str)+1;
}
int GetOffset() const{
return _curOffset;
}
const char *  GetString(int offset)const {
return _buffer+offset;
}
bool IsEqual(int offset,const char* str) const{
assert(offset+std::strlen(str)+1<maxBufferSize);
return std::strcmp(_buffer+offset,str)==0;
}
private:
static const int maxBufferSize=500;
char  _buffer[maxBufferSize];
int   _curOffset;
};
class StringTable
{
private:
static const int idNoFound=-1;
static const int maxStrings=100;
HTable       _hTable;
int          _offset[maxStrings];
int          _currId;
StringBuffer _strBuffer;
public:
StringTable():_currId(0){}
int ForceAdd(char const * str){
int len=std::strlen(str);
if(_currId==maxStrings||!_strBuffer.WillFit(len))
return idNoFound;
_offset[_currId]=_strBuffer.GetOffset();
_strBuffer.Add(str);
_hTable.Add(str,_currId);
++_currId;
return _currId-1;
}
int Find(char const * str) const{
const List& list =_hTable.Find(str);
for (const Link* temp=list.GetHead();temp!=0;temp=temp->Next())
{
if(_strBuffer.IsEqual(_offset[temp->Id()],str))
return _offset[temp->Id()];
}
return idNoFound;
}
const char* GetString(int id) const{
assert(0<id&&id<_currId);
return _strBuffer.GetString(_offset[id]);
}
};
#include <iostream>
#include <string>
#include "IStack.h"

#define   KEYNUMUp                       0x48             //键盘上键
#define   KEYNUMDown                     0x50             //键盘下键
#define   KEYNUMLeft                     0x4b             //键盘左键
#define   KEYNUMRight                    0x4d             //键盘右键
#define   KEYNUMPageUp                   0x49             //键盘向上翻页键
#define   KEYNUMPageDown                 0x51             //键盘向下翻页键

int main()
{
StringTable stringTable;
stringTable.ForceAdd("one");
stringTable.ForceAdd("two");
stringTable.ForceAdd("chenyu");
int id=stringTable.Find("two");
std::cout<<"one is find and the offset is "<<id<<std::endl;
std::cin.get();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐