字典结构及借助顺序表的实现

原创 2016年05月30日 17:11:05

字典的ADT C++定义:

#ifndef DICADT_H
#define DICADT_H

template <typename Key, typename E>
class Dictionary{
private:
    void operator=(const Dictionary&){}
    Dictionary(const Dictionary&){}

public:
    Dictionary(){}
    virtual ~Dictionary(){}

    //初始化字典
    virtual void clear() = 0;

    //插入一条记录
    //k: 插入的key
    //e: 插入的record
    virtual void insert(const Key& k, const E& e) = 0;

    //删除并返回此记录
    //k: 将被删除的key
    //return: 一条匹配的记录。如果有多条记录匹配key,任意删除一条,没匹配记录则返回NULL
    virtual E remove(const Key& k) = 0;

    //任意删除一条记录
    //return: 返回被删除的记录,不存在返回NULL
    virtual E removeAny() = 0;

    //return:一条匹配k的记录
    //多条匹配则返回任意一条
    virtual E find(const Key& k) const = 0;

    //返回记录总数
    virtual int size() = 0;
};
#endif

键值对KVpair的实现

template <typename Key, typename E>
class KVpair{
private:
    Key k;
    E e;

public:
    //constructors
    KVpair(){}
    KVpair(Key kval, E eval){
        k = val;
        e = eval;
    }
    KVpair(const KVpair& o){
        k = o.k;
        e = o.e;
    }

    Key key(){
        return k;
    }

    void setKey(Key ink){
        k = ink;
    }

    E value(){
        return e;
    }
};

使用无序数组实现的字典

template <typename Key, typename E>
class UALdict : public Dictionary<Key, E>{
private:
    AList<KVpair<Key, E> >* list;
public:
    UALdict(int size = defalutSize){
        list = new AList<KVpair<Key, E> >(size);
    }

    ~UALdict(){
        delete list;
    }

    void clear(){
        list->clear();
    }

    E remove(const Key& k){
        E temp = find(k);
        if (temp != NULL)
            list->remove();
        return temp;
    }

    //删除最后一个元素
    E removeAny(){
        Assert(size() != 0, "Dictionary is empty");
        list->moveToEnd();
        list->prev();
        KVpair<Key, E> e = list->remove();
        return e.value();
    }

    E find(const Key& k) const{
        for (list->moveToStart(); list->currPos() < list->length(); list->next()){
            KVpair<Key, E> temp = list->getValue();
            if (k == temp.key())
                return temp.value();
        }
        return NULL;
    }

    int size(){
        return list->length();
    }
};

有序表的实现:

//有序表
template <typename Key, typename E>
class SAList : protected AList<KVpair<Key, E> >{
public:
    SAList(int size = defaultSize)
        : AList<KVpair<Key, E> >(size)
    {}

    ~SAList(){}

    //重定义insert函数保证values有序
    void insert(KVpair<Key, E>& it){
        KVpair<Key, E> curr;
        for (moveToStart(); currPos() < length(); next()){
            curr = getValue();        //获取当前AList中的KVpair元素
            if (curr.key() > it.key())
                break;
        }
        AList<KVpair<Key, E> >::insert(it);//执行AList的insert函数
    }

    //除了append()函数以外,以下AList的函数仍可使用
    AList<KVpair<Key, E> >::clear;
    AList<KVpair<Key, E> >::remove;
    AList<KVpair<Key, E> >::moveToStart;
    AList<KVpair<Key, E> >::moveToEnd;
    AList<KVpair<Key, E> >::prev;
    AList<KVpair<Key, E> >::next;
    AList<KVpair<Key, E> >::length;
    AList<KVpair<Key, E> >::currPos;
    AList<KVpair<Key, E> >::moveToPos;
    AList<KVpair<Key, E> >::getValue;
};

利用有序表实现的字典:

template <typename Key, typename E>
class SALdict : public Dictionary<Key, E>{
private:
    SAList<Key, E>* list;
public:
    SALdict(int size = defaultSize){
        list = new SAList<Key, E>(size);
    }

    ~SALdict(){}

    //insert一个元素;保证有序
    void insert(const Key& k, const E& e){
        KVpair<Key, E> temp(k, e);
        list->insert(temp);
    }

    //查找将要删除的元素并删除
    E remove(const Key& k){
        E temp = find(k);
        if (temp != NULL)
            list->remove();
        return temp;
    }

    E removeAny(){        //实现为删除最后一个元素
        Assert(size() != 0, "Dictionary is empty");
        list->moveToEnd();
        list->prev();
        KVpair<Key, E> e = list->remove();
        return e.value();
    }

    //查找采用二分查找提高检索效率
    E find(const Key& k) const {
        int l = -1;
        int r = list->length();
        while (l + 1 != r){
            int i = (l + r) / 2;
            list->moveToPos(i);
            KVpair<Key, E> temp = list->getValue();
            if (k < temp.key())
                r = i;
            if (k == temp.key())
                return temp.value();
            if (k > temp.key())
                l = i;
        }
        return NULL;
    }

    int size(){
        return list->length();
    }
};

注:本程序中AList顺序表的实现地址:
http://blog.csdn.net/y396397735/article/details/51513593

版权声明:个人学习之路,若有误,欢迎指正。

二叉树 实现 输入单词按字典顺序排序

#include "stdafx.h" #include struct tnode { /* the tree node: */ char *word; /* p...
  • wangyangtao
  • wangyangtao
  • 2011年02月27日 17:39
  • 1109

二叉搜索树实现简单字典

日常生活中我们经常使用字典来查找单词的中文意思,也会根据中文来查找所对应的汉语。前面我们知道二叉树实现可以迅速查找一个数据,而且可以插入和删除。 这里我们可以用搜索二叉树实现简单的字典,查找英文单词...
  • f2016913
  • f2016913
  • 2017年04月04日 09:52
  • 649

全排列的实现方法--递归&字典序

一:背景 全排列在很多笔试都有应用,是一个很常见的算法,关于这类的题目变化很多。这种算法的得到基于以下的分析思路。  给定一个具有n个元素的集合(n>=1),要求输出这个集合中元素的所有可能的排列。 ...
  • LaoJiu_
  • LaoJiu_
  • 2016年04月11日 15:33
  • 5573

按照字典排序,生成1-n队列(java实现)

public class Test { public static void print_permutation(int n,int[] a,int cur){ if(cur == n){//如...
  • kangaroo835127729
  • kangaroo835127729
  • 2014年08月07日 15:59
  • 1559

数据结构 - 简单的顺序表结构

1. 编写一个程序exp2-1.cpp,实现顺序表的各种运算(假设顺序表的元素类型为char),并在此基础上完成如下功能: (1)初始化顺序表L; (2)采用尾插法依次插入元素a,b,c,d,e; (...
  • mayuko2012
  • mayuko2012
  • 2016年03月21日 19:07
  • 714

数据结构(一)——顺序表(C语言实现)

顺序表的简单实现
  • flueky
  • flueky
  • 2016年09月30日 18:00
  • 1427

OC用二叉树实现省市区字典

首先我们需要一个全国省市区的文本文件area.txt 创建类 TreeNode #import  @interface TreeNode : NSObject @property ...
  • lozzz
  • lozzz
  • 2015年03月01日 12:23
  • 570

Efficient Solutions+BST(排序二叉树)

Efficient Solutions Input: Standard Input  Output: Standard Output "Our marriage ceremonies are s...
  • u012870383
  • u012870383
  • 2014年09月02日 19:03
  • 288

顺序表的类声明和实现

顺序表的C++类声明和实现
  • Tao_fufang
  • Tao_fufang
  • 2015年04月09日 19:55
  • 551

线性表顺序实现和链式实现区别

对线性表的操作主要有查找,插入和删除三大类。 基于时间上的比较         查找时,数组是可以随机存取的,因此查找时间复杂度为O(1),对于链表,每次查找都必须从链表的首结点开始,时间...
  • langsky001
  • langsky001
  • 2016年07月19日 23:45
  • 481
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字典结构及借助顺序表的实现
举报原因:
原因补充:

(最多只允许输入30个字)