莫斯码的解析
本代码只针对单音节字母进行了处理,不支持双音节和特殊符号。若想扩展,只需要把code_map的key类型更改为string即可。
构建树
首先要构建一个下图这样的树状结构。
typedef struct Node {
Node *l;
Node *r;
std::string value;
Node(const char *v):value(v) {
}
Node() {
l = nullptr;
r = nullptr;
}
Node(const std::string &v):value(v) {
}
}Node;
std::map<char, const char*> code_map;
void build_code_map() {
code_map['T']=" - ";
code_map['M']=" - - ";
code_map['O']=" - - - ";
code_map['H']=" - - - -";
// code_map['Ö']=" - - - .";
code_map['G']=" - - . ";
code_map['Q']=" - - . -";
code_map['Z']=" - - . .";
code_map['N']=" - . ";
code_map['K']=" - . - ";
code_map['Y']=" - . - -";
code_map['C']=" - . - .";
code_map['D']=" - . . i";
code_map['X']=" - . . -";
code_map['B']=" - . . .";
code_map['E']=" . ";
// A32 -62 -73 32 -30 -128 -109 32 32 32
code_map['A']=" . - ";
code_map['W']=" . - - ";
code_map['J']=" . - - -";
code_map['P']=" . - - .";
code_map['R']=" . - . ";
// code_map['Ä']=" . - . -";
code_map['L']=" . - . .";
code_map['I']=" . . ";
code_map['U']=" . . - ";
// code_map['Ü']=" . . - -";
code_map['F']=" . . - .";
code_map['S']=" . . . ";
code_map['V']=" . . . -";
code_map['H']=" . . . .";
}
Node* new_node(Node *root, bool l) {
Node *newNode = new Node();
if(l) {
if(root->l == nullptr) {
root->l = newNode;
}
return root->l;
}else {
if(root->r == nullptr) {
root->r = newNode;
}
return root->r;
}
}
void build_tree(Node *root, char ch, const char*code) {
for(int i = 0; i < strlen(code); ++i) {
char cur_code = code[i];
if(cur_code == '.' || cur_code == '-') {
Node *child_node = new_node(root, cur_code == '.');
build_tree(child_node, ch, code+i+1);
return;
}
}
root->value = ch;
}
解码
void display_node(Node *root) {
if(root == nullptr || root->value == std::string("root")) {
std::cout << ' ';
return ;
}
std::cout << root->value;
}
void encode(Node *root, const char*code, int &index) {
if (root == nullptr) {
std::cout << "err";
return ;
}
for(index; index < strlen(code); ++index) {
char cur_code = code[index];
if((cur_code == '.' || cur_code == '-')) {
index = index +1;
if(cur_code == '.') {
encode(root->l, code, index);
}else {
encode(root->r, code, index);
}
return;
}
// 空格结束 连续空格表示单词分隔
display_node(root);
++index;
return;
}
//结尾
display_node(root);
++index;
}
完整代码
#include <string>
#include <iostream>
#include <map>
#include <string.h>
using namespace std;
typedef struct Node {
Node *l;
Node *r;
std::string value;
Node(const char *v):value(v) {
}
Node() {
l = nullptr;
r = nullptr;
}
Node(const std::string &v):value(v) {
}
}Node;
std::map<char, const char*> code_map;
void build_code_map() {
code_map['T']=" - ";
code_map['M']=" - - ";
code_map['O']=" - - - ";
code_map['H']=" - - - -";
// code_map['Ö']=" - - - .";
code_map['G']=" - - . ";
code_map['Q']=" - - . -";
code_map['Z']=" - - . .";
code_map['N']=" - . ";
code_map['K']=" - . - ";
code_map['Y']=" - . - -";
code_map['C']=" - . - .";
code_map['D']=" - . . i";
code_map['X']=" - . . -";
code_map['B']=" - . . .";
code_map['E']=" . ";
// A32 -62 -73 32 -30 -128 -109 32 32 32
code_map['A']=" . - ";
code_map['W']=" . - - ";
code_map['J']=" . - - -";
code_map['P']=" . - - .";
code_map['R']=" . - . ";
// code_map['Ä']=" . - . -";
code_map['L']=" . - . .";
code_map['I']=" . . ";
code_map['U']=" . . - ";
// code_map['Ü']=" . . - -";
code_map['F']=" . . - .";
code_map['S']=" . . . ";
code_map['V']=" . . . -";
code_map['H']=" . . . .";
}
Node* new_node(Node *root, bool l) {
Node *newNode = new Node();
if(l) {
if(root->l == nullptr) {
root->l = newNode;
}
return root->l;
}else {
if(root->r == nullptr) {
root->r = newNode;
}
return root->r;
}
}
void build_tree(Node *root, char ch, const char*code) {
for(int i = 0; i < strlen(code); ++i) {
char cur_code = code[i];
if(cur_code == '.' || cur_code == '-') {
Node *child_node = new_node(root, cur_code == '.');
build_tree(child_node, ch, code+i+1);
return;
}
}
root->value = ch;
}
void display_node(Node *root) {
if(root == nullptr || root->value == std::string("root")) {
std::cout << ' ';
return ;
}
std::cout << root->value;
}
void encode(Node *root, const char*code, int &index) {
if (root == nullptr) {
std::cout << "err";
return ;
}
for(index; index < strlen(code); ++index) {
char cur_code = code[index];
if((cur_code == '.' || cur_code == '-')) {
index = index +1;
if(cur_code == '.') {
encode(root->l, code, index);
}else {
encode(root->r, code, index);
}
return;
}
// 空格结束 连续空格表示单词分隔
display_node(root);
++index;
return;
}
//结尾
display_node(root);
++index;
}
int main() {
build_code_map();
Node *root = new Node("root");
for(auto it = code_map.begin(); it != code_map.end(); ++it) {
build_tree(root, it->first, it->second);
}
int index = 0;
const char *code = ". .-- .--- -- ";
std::string str;
std::getline(std::cin, str);
if(!str.empty()) {
code = str.c_str();
}
std::cout << code << std::endl;
for(;index < strlen(code);) {
encode(root, code, index);
}
return 0;
}