第 1 节 解密 QQ 号——队列
 
新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问 QQ 号,小哈当然不会直接告诉小哼啦,原因嘛你懂的。
所以小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则。
规则是这样的:首先将第 1 个数删除,紧接着将第 2 个数放到这串数的末尾,再将第 3 个数删除并将第 4 个数放到这串数的末尾,再将第 5 个数删除……
直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小哈的 QQ 啦。
现在你来帮帮小哼吧。小哈给小哼加密过的一串数是“6 3 1 7 5 8 9 2 4”。
 
 internal struct queue
{
public int[] data;
public int head;
public int tail;
} static void Main(string[] args)
{
queue q = new queue();
q.data = new int[];
q.head = ;
q.tail = ; for (int i = ; i <= ; i++)
{
q.data[i] = Convert.ToInt32(Console.ReadLine());
q.tail++;
} while(q.head < q.tail)
{
Console.Write(q.data[q.head]);
q.head++; q.data[q.tail] = q.data[q.head];
q.head++;
q.tail++;
}
}
解密的第一步是将第一个数删除,你可以想一下如何在数组中删除一个数呢。
最简单的方法是将所有后面的数都往前面挪动一位,将前面的数覆盖。
就好比我们在排队买票,最前面的人买好离开了,后面所有的人就需要全部向前面走一步,补上之前的空位,但是这样的做法很耗费时间。
 

在这里,我将引入两个整型变量head 和tail。

head 用来记录队列的队首(即第一位),tail 用来记录队列的队尾(即最后一位)的下一个位置。

你可能会问:为什么tail 不直接记录队尾,却要记录队尾的下一个位置呢?

这是因为当队列中只剩下一个元素时,队首和队尾重合会带来一些麻烦。

我们这里规定队首和队尾重合时,队列为空。

现在有9 个数,9 个数全部放入队列之后head=1;tail=10;此时head 和tail 之间的数就是目前队列中“有效”的数。

如果要删除一个数的话,就将head++就OK 了,这样仍然可以保持head 和tail 之间的数为目前队列中“有效”的数。

这样做虽然浪费了一个空间,却节省了大量的时间,这是非常划算的。

新增加一个数也很简单,把需要增加的数放到队尾即q[tail]之后再tail++就OK 啦。

我们来小结一下,在队首删除一个数的操作是head++;。

在队尾增加一个数(假设这个数是x)的操作是q[tail]=x;tail++;。

整个解密过程,请看下面这个霸气外漏的图。

最后的输出就是6 1 5 9 4 7 2 8 3

 
队列是一种特殊的线性结构,它只允许在队列的首部(head)进行删除操作,这称为“出队”,而在队列的尾部(tail)进行插入操作,这称为“入队”。
当队列中没有元素时(即 head==tail),称为空队列。
在我们的日常生活中有很多情况都符合队列的特性。
比如我们之前提到过的买票,每个排队买票的窗口就是一个队列。
在这个队列当中,新来的人总是站在队列的最后面,来得越早的人越靠前,也就越早能买到票,就是先来的人先服务,我们称为“先进先出”(FirstIn First Out,FIFO)原则

 
第2 节 解密回文——栈
 
队列是先进先出,而栈相反,先进后出
拿书中的例子来讲,我们将1,2,3号球,放进竹筒里,效果应该是这样的

3
2
1
 
 
 
这个时要取出1号球,就要先将3,2依此取出后,才能够得到1
 
于是我们就可以利用栈来解决一个小小的问题,就是回文字符串
 
回文字符串就是指正读反读均相同的字符序列,如“席主席”、“记书记”、“aha”和“ahaha”均是回文
 
就拿xyzyx举例
 
先从字符串中间开始,我们让前半部分,放入栈中
x y      
 
 
然后越过中心点z,对后半部分的字符串进行判断,利用栈的特点,第一个出来的是y,而刚好中心点后的字符也是y,依此类推进行判断
 static void PalindromeString()
{
Write("请输入一串字符:");
string str = ReadLine();
char[] cstr = str.ToCharArray(); //设置栈
char[] stack = new char[]; //得到字符串的长度
int len = str.Length;
//得到字符串中间点
int mid = len/;
//初始化栈顶
int top = ; //将字符串前半段入栈
for (int i = ; i < mid; i++)
{
stack[top] = cstr[i];
top++;
} //如果字符长度是偶数,就不需要+1到中间点
int next = (len%) == ? mid : (mid+); //接着往下判断
for (int i = next; i < len; i++)
{
//减一原因就是,数组长度-1位
--top;
//判断是否回文,利用栈的特点先进后出
if(str[i] != stack[top]) break;
} WriteLine(top==?"yes":"no");
}

栈还可以用来进行验证括号的匹配。比如输入一行只包含“()[]{}”的字符串,请判断
形如“([{}()])”或者“{()[]{}}”的是否可以正确匹配。显然上面两个例子都是可以正确匹
配的。“([)]”是不能匹配的。有兴趣的同学可以自己动手来试一试。

代码参考来源此处:https://www.jianshu.com/p/5bf5aecc9cd5

static void Main(string[] args)
{
//左边括号
string left= "{([<";
//右边括号
string right = "})]>"; bool flag = false; Write("请输入一组括号组合(),[],{},<>:");
char[] cstr = ReadLine().ToCharArray(); //初始化栈
Stack stack = new Stack(cstr.Length*);
for (int i = ; i < cstr.Length; i++)
{
int indexleft = -, indexright = -;
indexleft = left.IndexOf(cstr[i]);
indexright = right.IndexOf(cstr[i]); if(indexleft >= )
{
stack.push(cstr[i]);
}
else if(indexright >= )
{
if(!stack.isEmpty() && (stack.peek() == left.ToCharArray()[indexright]))
{
stack.pop();
}
else
{
flag = true;
break;
}
}
} if(flag) {
WriteLine("no");
return;
};
//栈清空,表示匹配完毕
WriteLine(stack.isEmpty()?"yes":"no");
} class Stack
{
public char[] values { get => stack;}
private char[] stack;
private int top = ;
public Stack(int max)
{
stack = new char[max];
}
public void push(char c) => stack[top++] = c;
public char peek()
{
return stack[top-];
}
public void pop()
{
top--;
stack[top] = '\0';
}
public bool isEmpty()
{
int i = ;
foreach (var item in stack)
{
if(item == '\0')
i++;
}
return i == stack.Length ? true : false;
}
}

啊哈!算法(第二章)C#实现的更多相关文章

  1. javascript数据结构和算法 第二章 (数组) 二

    字符串表示的数组 join() 和 toString() 函数返回数组的字符串表示.这两个函数通过将数组中的元素用逗号分隔符切割,返回字符串数组表示. 这里有个样例: var names = [&qu ...

  2. java版数据结构与算法第二章数组

    数组由一组具有相同类型的数据元素组成,并存储在一组连续存储单元中.一维数组是常量. 二维数组:若一维数组中的数据元素又是一堆数据结构,我们称之为二维数组.二维数组可以看成是n个列向量组成的线性表. 数 ...

  3. 【学习总结】java数据结构和算法-第二章-数据结构和算法概述

    总目录链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 数据结构和算法的关系 几个实际编程中的问题 线性结构和非线性结构 数据结构和算法的关系 几个实际编程中 ...

  4. 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组

    第二章 数组 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构.JavaScript里也有数组类型,虽然它的第一个版本并没有支持数组.本章将深入学习数组数据结构和它的能力. 为什么 ...

  5. 算法导论 第一章and第二章(python)

    算法导论 第一章 算法     输入--(算法)-->输出   解决的问题     识别DNA(排序,最长公共子序列,) # 确定一部分用法     互联网快速访问索引     电子商务(数值算 ...

  6. 算法<初级> - 第二章 队列、栈、哈希表相关问题

    算法 - 第二章 数据结构 题目一 用数组实现大小固定的队列和栈(一面题) 数组实现大小固定栈 /*** * size是对头索引(initSize是固定大小) 也是当前栈大小 * size=下个进队i ...

  7. Machine Learning In Action 第二章学习笔记: kNN算法

    本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数 ...

  8. 第二章:排序算法 及其他 Java代码实现

    目录 第二章:排序算法 及其他 Java代码实现 插入排序 归并排序 选择排序算法 冒泡排序 查找算法 习题 2.3.7 第二章:排序算法 及其他 Java代码实现 --算法导论(Introducti ...

  9. 实现 RSA 算法之 C 语言实现(第二章)(老物)

    第二章 如何实现应用RSA算法 趁着白天在自家店里的闲暇时间来写写第二章了,假设记住了第一章的各种定理之后,我们又该如何实现RSA密码的加密解密呢?也懒得废话了,直接进入正题吧. 先回顾几个知识点: ...

  10. 《算法导论》第二章demo代码实现(Java版)

    <算法导论>第二章demo代码实现(Java版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...

随机推荐

  1. NIO的整体认识

    目录 1.Java NIO简介 2.java NIO和IO的主要区别 3.缓冲区buffer和通道channel 3.1.缓冲区buffer 3.2.channel 4.文件通道fileChannel ...

  2. nbu虚拟机恢复样例(之后补图)

    9.2.1进入Backup,Archive,and Restore管理器 9.2.2选择客户端和策略类型 9.2.3选择恢复的虚拟机 9.2.4恢复虚拟机到不同目录 9.2.5更改虚拟机名称和存储 因 ...

  3. linux突然不能上网,eth0网卡消失

    情况:之前可以正常浏览网页,没有动其它的地方,浏览器突然不能上网 ifconfig # 发现eth0网卡不见了,只有lo卡 ifconfig -a # 发现了eth0,但是没有IP地址 dhclien ...

  4. BSGS算法(大小步算法)

    $BSGS$ 算法 $Baby\ Steps\ Giant\ Steps$. 致力于解决给定两个互质的数 $a,\ p$ 求一个最小的非负整数 $x$ 使得 $a^x\equiv b(mod\ p)$ ...

  5. WPF 用户控件的自定义依赖属性在 MVVM 模式下的使用备忘

    依赖属性相当于扩充了 WPF 标签的原有属性列表,并可以使用 WPF 的绑定功能,可谓是十分方便的:用户控件则相当于代码重用的一种方式:以上几点分开来还是比较好理解的,不过要用到MVVM 模式中,还是 ...

  6. 【大数据】0002---MongoDB集群自动分离创建新集群

    场景:MongoDB集群运行后,自动产生新的集群 解答:可能没有理解问题,理清思路如下 1.日志分析 2.配置文件检查(日期.版本) 3.网络IP变化 4.github 5.stack overflo ...

  7. c语言定义的几种易错的说明

    int p; //一个整数 int p [5]; //一个包含5个整数的数组 int * p; //指向整数的指针 int * p [10]; //一个包含10个整数指针的数组 int ** p; / ...

  8. 【oracle】decode函数

    DECODE(参数,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) 值1:当参数=值1    翻译值1:想要得到的值 值2:当参数=值2 翻译值2:想要得到的值

  9. Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging

    1665 - Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT a ...

  10. Linux中一些命令的区别

    1. yum provides 和 yum search provides是在文件中查找软件,类似于rpm -qf: search是查找软件包或其描述的关键字. 2. gzip  和  bzip2 对 ...