第四章 解决队列的编程问题
队列是一种特殊的线性表,是一种只允许在表的一端进行插入操作而在另一端进行删除操作的线性表。把进行插入操作的表尾称为队尾,进行删除操作的头部称为对头;
队列的主要特点是:先进先出,或后进后出
用一片连续的存储空间来存储队列中的数据元素,这样的队列称为顺序队列。
将顺序队列看成是首位相接的循环结构,这种队列叫做循环队列。
第五章 解决串的编程问题
串即字符串,是由0个或多个字符组成的有限序列,是数据元素为单个字符的特殊线性表。
顺序结构存储串:
串的静态存储结构即顺序存储结构是用一组地址连续的存储单元存储串的字符序列。因此可用高级语言的字符数组来实现。不同的语言在用数组存放字符串时,其处理方式可能有所不同。
1) C语言:先预先定义数组的大小,为每个串变量分配一个固定长度的数组,接着再使用定长的字符数组存放串内容外,一般可使用一个不会出现在传中的特殊字符“\0”放在串值的末尾来表示串的结束。如下图,存储字符串“abc”,申请的存储区域可能大于实际的大小。
2) C#等.net语言中,字符串用常量的方式存储。这意味着,当你用C#创建一个字符串时,该字符串以一种固定大小存储在内存中以便CLR(通用语言运行时)运行更快一点。如下图,存储字符串“abc”。
凯撒密码
凯撒密码是一种简单的密码加密算法,通过将信息中的每个字母在字母表中向后移动常量k,以实现加密。例如,k=3,则a->d,b->e等;即映射关系为:
F(a)=(a+k)mod n
其中,a为要加密的字母;k为移动的位数,n是字母的长度。
要解密信息,则将每个字母向前移动相同数目的字符即可。例如,如果k=3,对于已加密信息frpsxwhu vbvwhpv,将解密为computer system;
【基本要求】
编写程序实现加密和解密算法
C#代码实现如下:
1) 凯撒加密解密类封装
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinkStack
{
class Kaiser_EncDec
{
/// <summary>
/// 加密算法
/// </summary>
/// <paramname="str"></param>
/// <paramname="k"></param>
///<returns></returns>
public static stringEncrypt(string str, int k)
{
string res =string.Empty;
char[] chalst =str.ToCharArray();
int len =str.Length;
for (int i = 0; i < len; i++)
{
inttmp=(int)chalst[i];
if (tmp >=65 && tmp <= 90)
{
tmp =(tmp-65 + k) % 26+65;
}
else if (tmp>= 97 && tmp <= 122)
{
tmp = (tmp- 98 + k) % 26 + 98;
}
res +=Encoding.ASCII.GetString(new byte[]{(byte)tmp});
}
return res;
}
/// <summary>
/// 解密算法
/// </summary>
/// <paramname="str"></param>
/// <paramname="k"></param>
///<returns></returns>
public static stringDecrypt(string str, int k)
{
string res =string.Empty;
char[] chalst =str.ToCharArray();
int len =str.Length;
for (int i = 0; i< len; i++)
{
int tmp =(int)chalst[i];
if (tmp >=65 && tmp <= 90)
{
tmp = (tmp - 65 - k+26) % 26 + 65;
}
else if (tmp>= 97 && tmp <= 122)
{
tmp = (tmp- 98 - k+26) % 26 + 98;
}
res +=Encoding.ASCII.GetString(new byte[] { (byte)tmp });
}
return res;
}
}
}
2) 主程序调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinkStack
{
class Program
{
static voidMain(string[] args)
{
string str ="Computer system";
Console.WriteLine("要加密的字符串:"+str);
stringstr_1=Kaiser_EncDec.Encrypt(str, 3);
Console.WriteLine("加密后的字符串:" + str_1);
stringstr_2=Kaiser_EncDec.Decrypt(str_1, 3);
Console.WriteLine("解密后的字符串:" + str_2);
Console.ReadKey();
}
}
}