电子小字典(键树)

news/2024/11/25 23:19:17/

电子小字典(查找)

[问题描述]

利用键树结构,建立一个微型电子字典。

[基本要求]

实现生词的加入,单词的查找、删除,修改等操作。

解题思路:

首先对键树结构进行解释。这里,我们每个节点中并不是一个或几个关键字,而是只含有组成关键字的符号。在这题中,每个节点只包含组成单词的字母。我们用结构体数组(vector类型)来存储键树,原键树的节点在这里对应数组的一格。先在“字典”中初始化26个英文字母(小写),作为插入、查询等的起始位置。

插入:对要插入单词的字母进行逐个遍历,先匹配字典中已有的部分,例如原来已有“be”,再插入“bean”时,就会先匹配be的部分,之后an的部分会在vector后面按顺序添加,最后将末尾字母的end置为1,代表一个单词插入完成。查询时,按照next进行追踪即可。删除:先查询,若查询成功,则获得末尾字母的编号,把末尾字母的end重新置为0,则删除成功;若查询失败,则插入失败。修改:考虑到修改的方式多种多样,可能是减短、增长或改变几个字母等,为了简便,这里就直接把原单词删除,再把修改后的单词插入到字典中。

程序代码:

# include <iostream>
# include <stdlib.h>
# include <string>
# include <vector>using namespace std;typedef struct Alphabet {char a;     //字母int end;    //是否为单词结尾(0:否 1:是)vector<int>next;
}Alphabet;//操作菜单
void Menu();
//添加单词
void InsertWord(string str);
//查询单词
int SearchWord(string str);
//删除单词
void DeleteWord(string str);
//修改单词
void ChangeWord(string str1, string str);
int num = 0;          //保存当前的数组长度
vector<Alphabet>word; //字典//主函数
int main()
{//初始化字典Alphabet al;for (int i = 0; i < 26; i++) {al.a = 97 + i;al.end = 0;word.push_back(al);num++;}int select;while (1) {int t;string str, str1;Menu();cout << "请选择:";cin >> select;if (select == 1) {//添加单词cout << "请输入要添加的单词:";cin >> str;InsertWord(str);}else if (select == 2) {//查询单词cout << "请输入要查询的单词:";cin >> str;t = SearchWord(str);if (t >= 0) {cout << "查询成功" << endl;}else {cout << "查询失败" << endl;}}else if (select == 3) {//删除单词cout << "请输入要删除的单词:";cin >> str;DeleteWord(str);}else if (select == 4) {//修改单词cout << "请输入要修改的单词:";cin >> str1;cout << "请输入修改后的单词:";cin >> str;ChangeWord(str1, str);}else {break;}}return 0;
}//操作菜单
void Menu()
{cout << "\n*******************************\n";cout << "**(1)、添加单词 *************\n";cout << "**(2)、查询单词 *************\n";cout << "**(3)、删除单词 *************\n";cout << "**(4)、修改单词 *************\n";cout << "**(5)、退出 *****************\n";cout << "*******************************\n";
}//添加单词
void InsertWord(string str)
{Alphabet al;int j = str[0] - 97;  //字母int t, i;for (i = 1; i < str.size(); i++) {t = 0;for (int k = 0; k < word[j].next.size(); k++) {int m = word[j].next[k];if (word[m].a == str[i]) {j = m;t = 1;break;}}if (!t) {//到此能遍历的单词部分break;}}while (i < str.size()) {//单词没有遍历完al.a = str[i];al.end = 0;word[j].next.push_back(num);word.push_back(al);j = num;num++;i++;}word[j].end = 1;
}//查询单词
int SearchWord(string str)
{int j = str[0] - 97;  //字母int t, i;for (i = 1; i < str.size(); i++) {t = 0;for (int k = 0; k < word[j].next.size(); k++) {int m = word[j].next[k];if (word[m].a == str[i]) {j = m;t = 1;break;}}if (!t) {//到此能遍历的单词部分break;}}if (i == str.size() && word[j].end) {return j;}else {return -1;}
}//删除单词
void DeleteWord(string str)
{int t = SearchWord(str);if (t >= 0) {word[t].end = 0;cout << "删除成功" << endl;}else {cout << "删除失败" << endl;}
}//修改单词
void ChangeWord(string str1, string str)
{int t = SearchWord(str1);if (t >= 0) {word[t].end = 0;InsertWord(str);cout << "修改成功" << endl;}else {cout << "修改失败" << endl;}
}

总结:

这种写法比较简单,但也有一定的缺点。对于单词的删除,我只是做了形式上的“删除”,保证其无法再被查询到,但其占据的空间还在,这样会导致空间的浪费。大家可以尝试自己改进。

以上是我对这道题的看法,很高兴与大家分享。


http://www.ppmy.cn/news/276670.html

相关文章

字典

1 定义 什么是字典: 1. 字典是一种可变的容器&#xff0c;可以存储任意类型的数据 2. 字典中的每个数据都是用"键" (key) 进行索引&#xff0c;而不像序列可以用下标进行索引 3. 字典中的数据没有先后关系&#xff0c;字典的存储是无序的 4. 字典的数据是以键(key)…

电子辞典

终于有了自己的电子辞典&#xff01;Papyrus PW-AT770

2786: [JSOI]Word Query电子字典

2786: [JSOI]Word Query电子字典 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 3[Submit][Status][Web Board] Description 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法&#xff0c;而只知道该单词的一个错误的近似拼法&#xff0c;这时人们…

拼多多 2020校招 多多的电子字典(字典树前缀搜索,DP)

多多鸡打算造一本自己的电子字典&#xff0c;里面的所有单词都只由a和b组成。 每个单词的组成里a的数量不能超过N个且b的数量不能超过M个。 多多鸡的幸运数字是K&#xff0c;它打算把所有满足条件的单词里的字典序第K小的单词找出来&#xff0c;作为字典的封面。 解题思路&…

使用TS装饰器从0封装一个socket.io服务器

背景 最近沉迷WebRTC技术&#xff0c;想用WebRTC试做一个快启动的文件传输PWA应用。涉及到使用websocket服务器传输WebRTC的信令&#xff0c;全栈的话自然是选择Nodejs做服务器了。 选型 因为项目体量肯定不是很大&#xff0c;所以所有选型都以高性能轻量为主要目标。前端选择…

Mybatis面试题

Mybatis常见面试题 #{}和${}的区别是什么&#xff1f; {}和${}的区别是什么&#xff1f; 在Mybatis中&#xff0c;有两种占位符 #{}解析传递进来的参数数据${}对传递进来的参数原样拼接在SQL中#{}是预编译处理&#xff0c;${}是字符串替换。使用#{}可以有效的防止SQL注入&…

新版本踩坑记录:SpringBoot2.3.x整合ElasticSearch7.6.x(ElasticsearchRestTemplate)包含类型转换踩坑

使用ElasticSearch7.6.x 的时候&#xff0c;和7之前的版本有很大的不同&#xff0c;下面列举了一些踩坑记录&#xff1a;eg &#xff1a;StringTerms 类型转换失败问题&#xff0c;聚合查询自动拆分搜索关键字问题…等等&#xff08;之后出现问题还会回头补坑&#xff09; 聚合…

观念 信仰的价格

转 观念 信仰的价格 观念 信仰的价格 要点&#xff1a;在社会上&#xff0c;有很多关于怎样训练创造力的讨论&#xff0c;而很少有人去讨论人为什么去创造。本问引入一个新的单位PH&#xff08;幸福值&#xff09;&#xff0c;来统一经济利润最大化和精神价值追求者之间的分歧…