啊哈!算法(第二章)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版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...
随机推荐
- <Android Studio> 4.Adapter的那些事 <一>
android 的表格显示和Windows桌面开发原理不同,其他平台转过来的同学要有心理准备,不要拿桌面开发的思维模式来思考android上的各种表格. 一.原理 此处使用ArrayAdapter来记 ...
- Class版本号和Java版本对应关系
1.背景 版本号不对,会报错,如下 2.版本对应情况 JDK 1.8 = 52 JDK 1.7 = 51 JDK 1.6 =50 JDK 1.5 = 49 JDK 1.4 = 48 JDK 1. ...
- oracle查看表空间的真实使用情况
--查看表空间的真实使用情况 set linesize 500 pagesize 500 col tablespace_name format a25 col TP_REAL_GB format a1 ...
- centos7放行1521端口
[root@localhost ~]# firewall-cmd --zone=public --add-port=1521/tcp --permanent success [root@localho ...
- Django extend(继承)模板标签
在 views.py 上修改 ... def ordered(req): return render(req, "ordered.html") def shopping_car(r ...
- elastic date时区问题解决办法
之前介绍filter date插件时就谈到时区问题,但是没有说明白.最近在使用range查询时间范围内的数据时出现了数据量不一致的情况.特地了解了下ELK Stack中关于时区的问题. 问题: 使用k ...
- Linux进程管理之top
关于Linux进程查看,前面讲解了ps命令,下面拉介绍另一个命令top ps:静态查看 top:动态查看 动态查看进程的状态 # top [root@wei ~]# top top - 18:38:4 ...
- kernel: nfsd: too many open TCP sockets, consider increasing the number of threads
在/var/log/syslog中看到如下报错: kernel: nfsd: too many open TCP sockets, consider increasing the number o ...
- nginx访问jupyter
现在jupyter已通过k8s安装完成,并通过nodeport暴露出来. 如果不能直接访问这个nodeport(像我在的公司)或是希望能组织好jupyter实例, 那应该如何调通呢? 这里包括两个技术 ...
- 201871010117-石欣钰《面向对象程序设计(java)》第二周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...