啊哈!算法(第二章)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版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...
随机推荐
- jdbc预编译实现方式
jdbc预编译可以有两种方式: 方式一.jdbc自己实现的预编译,就是做一下特殊字符处理来防SQL注入,看PreparedStatement源码就可以了. public static void mai ...
- 2.redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?
作者:中华石杉 面试题 redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发? 面试官心理分析 这个是问 redis 的时候,最基本的 ...
- intellij idea 2019 右键包新建文件是没有java Class选项
今天要测试一个技术点于是新建了一个springboot工程, 在新建文件的时候发现右键后java class文件选项不见了. 以前真的没有碰到这种问题, 感觉很是意外于是百度Google后找到了解决办 ...
- Linux的网络参数设置
前面讲解了lLinux 的IP组成,下面就讲一下Linux的网络设置和数据传递. 其实这地方对运维的人员来说,不会要精通,但还是要了解.必要时刻还会用到的 电脑之间数据的传递: 数据的传递要分为下面几 ...
- ASS/SSA字幕格式
[时间:2019-04] [状态:Open] [关键词:字幕,ASS,SSA,文件格式,v4 Styles,字幕特效] 0 引言 SubStation Alpha(Sub Station Alpha) ...
- Codeforces H. Kilani and the Game(多源BFS)
题目描述: Kilani and the Game time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- rhel6安装rabbitmq-sever
1.下载rabbitmq-sever3.7.7,我下的是RHEL/CentOS 6.x, 你的系统是哪个版本就下哪个https://github.com/rabbitmq/ Downloadson G ...
- Jmeter做webservices接口测试
在Soap/XML-RPC Data中输入: <?xml version="1.0" encoding="utf-8"?> <soap12:E ...
- JMeter5.1开发JDBC协议接口脚本
配置 qzcsbj是连接池名称 jdbc:mysql://localhost:3306/qzcsbj?useUnicode=true&characterEncoding=utf8&al ...
- woocommerce面包屑导航breadcrumb的修改
我们知道woocommerce自带了面包屑导航breadcrumb,但有时我们需要调整一下它所在的位置,那么需要如何操作呢?有哪些参数可以调用呢?随ytkah一起来看看吧 首先删除默认的面包屑导航 1 ...