在计算机科学中,游程编码(Run-Length Encoding,简称RLE)是一种简单而高效的数据压缩技术。它特别适用于包含大量连续重复字符的数据,比如位图图像、日志文件或某些类型的文本。本文将用通俗易懂的方式,带你从零开始理解并用C++语言实现游程编码算法,即使你是编程小白也能轻松掌握!
想象一下,你有一串字母:AAABBBCCDAA。你会发现其中有很多连续重复的字符。游程编码的核心思想就是:用“字符 + 重复次数”的方式来表示这一段重复内容。
以上面的例子为例,压缩后可以表示为:A3B3C2D1A2。这样,原本11个字符被压缩成了10个字符。虽然看起来节省不多,但如果原始数据中有成百上千个连续相同的字符(比如一张纯色背景的图片),压缩效果就非常显著了!

下面我们用C++编写一个完整的游程编码程序。我们将实现两个函数:
compress():将原始字符串压缩为RLE格式decompress():将RLE格式解压回原始字符串#include <iostream>#include <string>#include <cctype>std::string compress(const std::string& input) { if (input.empty()) return ""; std::string result = ""; char current_char = input[0]; int count = 1; for (size_t i = 1; i < input.length(); ++i) { if (input[i] == current_char) { count++; } else { result += current_char; result += std::to_string(count); current_char = input[i]; count = 1; } } // 处理最后一组字符 result += current_char; result += std::to_string(count); return result;}解压时需要注意:数字可能不止一位(比如12次重复),所以我们不能简单地每次读一个字符。这里我们逐字符解析,遇到字母就记住它,遇到数字就累积成完整数字,然后重复输出。
std::string decompress(const std::string& encoded) { if (encoded.empty()) return ""; std::string result = ""; char current_char = '\0'; std::string num_str = ""; for (char c : encoded) { if (std::isalpha(c)) { // 如果之前有字符和数字,先输出 if (current_char != '\0' && !num_str.empty()) { int count = std::stoi(num_str); result.append(count, current_char); num_str = ""; } current_char = c; } else if (std::isdigit(c)) { num_str += c; } } // 处理最后一组 if (current_char != '\0' && !num_str.empty()) { int count = std::stoi(num_str); result.append(count, current_char); } return result;}int main() { std::string original = "AAABBBCCDAA"; std::cout << "原始字符串: " << original << std::endl; std::string compressed = compress(original); std::cout << "压缩后: " << compressed << std::endl; std::string decompressed = decompress(compressed); std::cout << "解压后: " << decompressed << std::endl; // 验证是否还原成功 if (original == decompressed) { std::cout << "✅ 压缩与解压成功!" << std::endl; } else { std::cout << "❌ 出错了!" << std::endl; } return 0;}ABCD 会被编码为 A1B1C1D1)。通过本教程,你已经掌握了如何用C++游程编码实现基本的数据压缩与解压。这项技术虽然简单,但在特定场景下非常实用。无论是学习游程编码算法原理,还是实践C++数据压缩技巧,这都是一个很好的起点。希望你能动手尝试,修改代码,甚至扩展它支持中文或二进制数据!
记住,编程的关键在于实践。快打开你的IDE,运行这段Run-Length Encoding C++代码,看看效果吧!
本文由主机测评网于2025-12-20发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251210651.html