强烈建议,《汇编语言》王爽编。这是16位汇编国内最好的一本书。
学了这个其他的就很容易搞明白了。其他的你需要:
《Cprimer中文版》
《 *** 作系统原理》
《windows环境下汇编语言程序设计第2版》(罗云彬编,这个也很不错,也很好懂,《 *** 作系统原理》讲理论的东西,它比《 *** 作系统原理》更加实用)
如果有必要,《计算机组成原理》也可以学学,这是从硬件角度考虑怎么实现CPU和内存的互相 *** 作。
加密:
#include <iostream>
#include <string>
using namespace std;
string encrypt(string text, int key)
{
string ciphertext = "";
int length = textlength();
for(int i=0; i<length; i+=2)
{
int x = text[i] - 'a';
int y = text[i+1] - 'a';
x = (x + key) % 26;
y = (y + key) % 26;
ciphertext += char(x + 'a');
ciphertext += char(y + 'a');
}
return ciphertext;
}
int main()
{
string text = "hello";
int key = 7;
string ciphertext = encrypt(text, key);
cout << "加密后的密文为:" << ciphertext << endl;
return 0;
}
解密:
#include <iostream>
#include <string>
using namespace std;
string decrypt(string ciphertext, int key)
{
string text = "";
int length = ciphertextlength();
for(int i=0; i<length; i+=2)
{
int x = ciphertext[i] - 'a';
int y = ciphertext[i+1] - 'a';
x = (x - key + 26) % 26;
y = (y - key + 26) % 26;
text += char(x + 'a');
text += char(y + 'a');
}
return text;
}
int main()
{
string ciphertext = "olssv";
int key = 7;
string text = decrypt(ciphertext, key);
cout << "解密后的明文为:" << text << endl;
return 0;
}
#include <stdioh>
#include <stdlibh>
#include <stringh>
#define N 100
#define M 2N-1
typedef char HuffmanCode[2M];//haffman编码
typedef struct
{
int weight;//权值
int parent;//父节节点
int LChild;//左子节点
int RChild;//右子节点
}HTNode,Huffman[M+1];//huffman树
typedef struct Node
{
char c; //叶子结点
int num; //叶子结点的二进制码的长度
}WNode,WeightNode[N];
/产生叶子结点的字符和权值/
void CreateWeight(char ch[],int s,WeightNode CW,int p)
{
int i,j,k;
int tag;
p=0;//叶子节点个数
//统计字符出现个数,放入CW
for(i=0;ch[i]!='\0';i++)
{
tag=1;
for(j=0;j<i;j++)
if(ch[j]==ch[i])
{
tag=0;
break;
}
if(tag)
{
CW[++p]c=ch[i];
CW[p]weight=1;
for(k=i+1;ch[k]!='\0';k++)
if(ch[i]==ch[k])
CW[p]weight++;//权值累加
}
}
s=i;//字符串长度
}
/创建HuffmanTree/
void CreateHuffmanTree(Huffman ht,WeightNode w,int n)
{
int i,j;
int s1,s2;
//初始化哈夫曼树
for(i=1;i<=n;i++)
{
ht[i]weight =w[i]weight;
ht[i]parent=0;
ht[i]LChild=0;
ht[i]RChild=0;
}
for(i=n+1;i<=2n-1;i++)
{
ht[i]weight=0;
ht[i]parent=0;
ht[i]LChild=0;
ht[i]RChild=0;
}
for(i=n+1;i<=2n-1;i++)
{
for(j=1;j<=i-1;j++)
if(!ht[j]parent)
break;
s1=j; //找到第一个双亲不为零的结点
for(;j<=i-1;j++)
if(!ht[j]parent)
s1=ht[s1]weight>ht[j]weightj:s1;
ht[s1]parent=i;
ht[i]LChild=s1;
for(j=1;j<=i-1;j++)
if(!ht[j]parent)
break;
s2=j; //找到第二个双亲不为零的结点
for(;j<=i-1;j++)
if(!ht[j]parent)
s2=ht[s2]weight>ht[j]weightj:s2;
ht[s2]parent=i;
ht[i]RChild=s2;
ht[i]weight=ht[s1]weight+ht[s2]weight;//权值累加
}
}
/叶子结点的编码/
void CrtHuffmanNodeCode(Huffman ht,char ch[],HuffmanCode h,WeightNode weight,int m,int n)
{
int i,c,p,start;
char cd;
cd=(char )malloc(nsizeof(char));
cd[n-1]='\0';//末尾置0
for(i=1;i<=n;i++)
{
start=n-1; //cd串每次从末尾开始
c=i;
p=ht[i]parent;//p在n+1至2n-1
while(p) //沿父亲方向遍历,直到为0
{
start--;//依次向前置值
if(ht[p]LChild==c)//与左子相同,置0
cd[start]='0';
else //否则置1
cd[start]='1';
c=p;
p=ht[p]parent;
}
weight[i]num=n-start; //二进制码的长度(包含末尾0)
h[i]=(char )malloc((n-start)sizeof(char));
strcpy(h[i],&cd[start]);//将二进制字符串拷贝到指针数组h中
}
free(cd);//释放cd内存
system("pause");
}
/所有字符的编码/
void CrtHuffmanCode(char ch[],HuffmanCode h,HuffmanCode hc,WeightNode weight,int n,int m)
{
int i,k;
for(i=0;i<m;i++)
{
for(k=1;k<=n;k++) /从weight[k]c中查找与ch[i]相等的下标K/
if(ch[i]==weight[k]c)
break;
hc[i]=(char )malloc((weight[k]num)sizeof(char));
strcpy(hc[i],h[k]); //拷贝二进制编码
}
}
/解码/
void TrsHuffmanTree(Huffman ht,WeightNode w,HuffmanCode hc,int n,int m)
{
int i=0,j,p;
printf("StringInformation\n");
while(i<m)
{
p=2n-1;//从父亲节点向下遍历直到叶子节点
for(j=0;hc[i][j]!='\0';j++)
{
if(hc[i][j]=='0')
p=ht[p]LChild;
else
p=ht[p]RChild;
}
printf("%c",w[p]c); /打印原信息/
i++;
}
}
/释放huffman编码内存/
void FreeHuffmanCode(HuffmanCode h,HuffmanCode hc,int n,int m)
{
int i;
for(i=1;i<=n;i++)//释放叶子结点的编码
free(h[i]);
for(i=0;i<m;i++) //释放所有结点的编码
free(hc[i]);
}
void print(Huffman &ht,int i,int space)//打印哈弗曼树
{
int j;
if(i)
{
print(ht,ht[i]RChild,space+5);
for(j=0;j<=space;j++)
printf(" ");
printf("%d\n",ht[i]weight);
print(ht,ht[i]LChild,space+5);
}
return ;
}
void main()
{
int i,n=0; /n为叶子结点的个数/
int m=0; /m为字符串ch[]的长度/
char ch[N]; /ch[N]存放输入的字符串/
Huffman ht; /Huffman二叉数 /
HuffmanCode h,hc; /h存放叶子结点的编码,hc 存放所有结点的编码/
WeightNode weight; /存放叶子结点的信息/
printf("\n");
printf(" 欢迎使用哈弗曼编码解码系统\n");
printf("\n");
printf("\tHuffmanCoding\n");
printf("please input information :");
gets(ch); /输入字符串/
CreateWeight(ch,&m,weight,&n); /产生叶子结点信息,m为字符串ch[]的长度/
printf("WeightInformation\n Node ");
for(i=1;i<=n;i++) /输出叶子结点的字符与权值/
printf("%c ",weight[i]c);
printf("\nWeight ");
for(i=1;i<=n;i++)
printf("%d ",weight[i]weight);
CreateHuffmanTree(ht,weight,n); /产生Huffman树/
printf("\nHuffamnTreeInformation\n");
printf("\ti\tweight\tparent\tLChild\tRChild\n");
for(i=1;i<=2n-1;i++) /打印Huffman树的信息/
printf("\t%d\t%d\t%d\t%d\t%d\n",i,ht[i]weight,ht[i]parent,ht[i]LChild,ht[i]RChild);
CrtHuffmanNodeCode(ht,ch,h,weight,m,n); /叶子结点的编码/
printf(" NodeCode\n"); /打印叶子结点的编码/
for(i=1;i<=n;i++)
{
printf("\t%c:",weight[i]c);
printf("%s\n",h[i]);
}
CrtHuffmanCode(ch,h,hc,weight,n,m); /所有字符的编码/
printf("StringCode\n\n"); /打印字符串的编码/
for(i=0;i<m;i++)
printf("%s",hc[i]);
system("pause");
TrsHuffmanTree(ht,weight,hc,n,m); /解码/
FreeHuffmanCode(h,hc,n,m);
printf("\n");
printf("\n哈弗曼树\n");
print(ht,2n-1,0);
system("pause");
}
以上就是关于c语言中堆栈的书籍推荐_c++编程书籍推荐全部的内容,包括:c语言中堆栈的书籍推荐_c++编程书籍推荐、c语言程序设计、赫夫曼OR哈弗曼编码 c语言 数据结构 简单的程序设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)