啊哈!算法(第二章)C#实现
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
3 |
2 |
1 |
x | 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#实现的更多相关文章
- javascript数据结构和算法 第二章 (数组) 二
字符串表示的数组 join() 和 toString() 函数返回数组的字符串表示.这两个函数通过将数组中的元素用逗号分隔符切割,返回字符串数组表示. 这里有个样例: var names = [&qu ...
- java版数据结构与算法第二章数组
数组由一组具有相同类型的数据元素组成,并存储在一组连续存储单元中.一维数组是常量. 二维数组:若一维数组中的数据元素又是一堆数据结构,我们称之为二维数组.二维数组可以看成是n个列向量组成的线性表. 数 ...
- 【学习总结】java数据结构和算法-第二章-数据结构和算法概述
总目录链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 数据结构和算法的关系 几个实际编程中的问题 线性结构和非线性结构 数据结构和算法的关系 几个实际编程中 ...
- 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组
第二章 数组 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构.JavaScript里也有数组类型,虽然它的第一个版本并没有支持数组.本章将深入学习数组数据结构和它的能力. 为什么 ...
- 算法导论 第一章and第二章(python)
算法导论 第一章 算法 输入--(算法)-->输出 解决的问题 识别DNA(排序,最长公共子序列,) # 确定一部分用法 互联网快速访问索引 电子商务(数值算 ...
- 算法<初级> - 第二章 队列、栈、哈希表相关问题
算法 - 第二章 数据结构 题目一 用数组实现大小固定的队列和栈(一面题) 数组实现大小固定栈 /*** * size是对头索引(initSize是固定大小) 也是当前栈大小 * size=下个进队i ...
- Machine Learning In Action 第二章学习笔记: kNN算法
本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数 ...
- 第二章:排序算法 及其他 Java代码实现
目录 第二章:排序算法 及其他 Java代码实现 插入排序 归并排序 选择排序算法 冒泡排序 查找算法 习题 2.3.7 第二章:排序算法 及其他 Java代码实现 --算法导论(Introducti ...
- 实现 RSA 算法之 C 语言实现(第二章)(老物)
第二章 如何实现应用RSA算法 趁着白天在自家店里的闲暇时间来写写第二章了,假设记住了第一章的各种定理之后,我们又该如何实现RSA密码的加密解密呢?也懒得废话了,直接进入正题吧. 先回顾几个知识点: ...
- 《算法导论》第二章demo代码实现(Java版)
<算法导论>第二章demo代码实现(Java版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...
随机推荐
- NIO的整体认识
目录 1.Java NIO简介 2.java NIO和IO的主要区别 3.缓冲区buffer和通道channel 3.1.缓冲区buffer 3.2.channel 4.文件通道fileChannel ...
- nbu虚拟机恢复样例(之后补图)
9.2.1进入Backup,Archive,and Restore管理器 9.2.2选择客户端和策略类型 9.2.3选择恢复的虚拟机 9.2.4恢复虚拟机到不同目录 9.2.5更改虚拟机名称和存储 因 ...
- linux突然不能上网,eth0网卡消失
情况:之前可以正常浏览网页,没有动其它的地方,浏览器突然不能上网 ifconfig # 发现eth0网卡不见了,只有lo卡 ifconfig -a # 发现了eth0,但是没有IP地址 dhclien ...
- BSGS算法(大小步算法)
$BSGS$ 算法 $Baby\ Steps\ Giant\ Steps$. 致力于解决给定两个互质的数 $a,\ p$ 求一个最小的非负整数 $x$ 使得 $a^x\equiv b(mod\ p)$ ...
- WPF 用户控件的自定义依赖属性在 MVVM 模式下的使用备忘
依赖属性相当于扩充了 WPF 标签的原有属性列表,并可以使用 WPF 的绑定功能,可谓是十分方便的:用户控件则相当于代码重用的一种方式:以上几点分开来还是比较好理解的,不过要用到MVVM 模式中,还是 ...
- 【大数据】0002---MongoDB集群自动分离创建新集群
场景:MongoDB集群运行后,自动产生新的集群 解答:可能没有理解问题,理清思路如下 1.日志分析 2.配置文件检查(日期.版本) 3.网络IP变化 4.github 5.stack overflo ...
- c语言定义的几种易错的说明
int p; //一个整数 int p [5]; //一个包含5个整数的数组 int * p; //指向整数的指针 int * p [10]; //一个包含10个整数指针的数组 int ** p; / ...
- 【oracle】decode函数
DECODE(参数,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) 值1:当参数=值1 翻译值1:想要得到的值 值2:当参数=值2 翻译值2:想要得到的值
- 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 ...
- Linux中一些命令的区别
1. yum provides 和 yum search provides是在文件中查找软件,类似于rpm -qf: search是查找软件包或其描述的关键字. 2. gzip 和 bzip2 对 ...