0001 #include <windows.h> 0002 #include "Huffman_PQ_test.h" 0003 0004 /****************************************************************************************** 0005 * 无论编码森林由列表、完全堆还是左式堆实现,本测试过程都可适用 0006 * 编码森林的实现方式采用优先级队列时,编译前对应的工程只需设置相应标志: 0007 * DSA_PQ_List | DSA_PQ_ComplHeap | DSA_PQ_LeftHeap | DSA_PQ_STACK_QUEUE 0008 ******************************************************************************************/ 0009 int main(int argc, char* argv[]) { //Huffman编码算法统一测试 0010 SetConsoleOutputCP(CP_UTF8); SetConsoleCP(CP_UTF8); 0011 if (3 > argc) { printf("Usage: %s <sample-text-file> <message#1> [message#2] ...\a\n", argv[0]); return -1; } 0012 uint32_t* freq = stat(argv[1], 0x20, 0x7F); //根据样本文件,统计各字符的出现频数 0013 for (char i = 0; i < N_CHAR; i++) //输出编码表 0014 printf(" %c: %d\n", i + 0x20, freq[i]); 0015 #if defined(DSA_PQ_STACK_QUEUE) 0016 HuffForest forest(freq, 0x20, 0x7F); 0017 #else 0018 HuffForest forest = initForest(freq); delete freq; //创建Huffman森林 0019 #endif 0020 HuffTree tree = huffTree(forest); print(tree); //构造Huffman编码树 0021 levelorder(tree.root(), visit()); printf("\n\n"); //验证:层次遍历序列中,各节点的权重单调非增 0022 HuffTable table = huffCodeTable(tree); //将Huffman编码树转换为编码表 0023 //printf("\n\n"); 0024 //for (char i = 0x20; i < 0x7F; i++) //输出编码表 0025 // printf(" %c: %s\n", i, table.get(i)->value); 0026 for (int i = 2; i < argc; i++) { //对于命令行传入的每一明文串 0027 Bitmap codeString; //二进制编码串 0028 int n = encode(table, codeString, argv[i]); //将根据编码表生成(长度为n) 0029 decode(tree, codeString, n); //利用Huffman编码树,对长度为n的二进制编码串解码 0030 } 0031 return 0; 0032 } //main