啊哈!算法(第二章)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版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...
随机推荐
- echarts 更改tooltip提示框CSS样式
最近 做项目,用过echarts,发现tooltip提示z-index级别很高,想更改下,看了下文档:https://www.echartsjs.com/zh/option.html#tooltip. ...
- 面试官问我,为什么老司机建议MySQL列属性尽量用 NOT NULL ?
本文阅读时间大约6分钟. 其实写这篇文章,也是来自一个知识星球读者的提问,他在二面的过程中被问到了,由于他简历中写道有 MySQL 调优经验,但这个问题没有回答好,二面被刷了. 其实我们刚学习 C 语 ...
- django rest_framework vue 实现用户列表分页
django rest_framework vue 实现用户列表分页 后端 配置urls # 导入view from api.appview.userListView import userListV ...
- recon-ng打开后显示No modules enabled/installed
今天开始学习使用 recon-ng,进去后发现这么一行: 原因 在网上找了挺久,发现了这篇文章:Recon-ng v5 Tutorial, 原来是更新的原因,需要我们自行安装模块(旧版本是自带了许多模 ...
- webuploader大文件分片,多线程总结
项目的新需求是用webuploader来做一个多文件,多线程,并且可以进行分块上传的要求,这些在前面的一篇文章当中足够使用了,但是现在又来一个新的需求,要求上传失败的文件进行重新的上传……心里默默说句 ...
- Python进阶-II 参数陷阱、命名空间、嵌套、作用域、闭包
一.参数陷阱 在使用默认参数时,可能碰见下列情况 def show_args_trap(i, li = []): li.append(100) li[i] = 101 print(li) show_a ...
- 【Linux】bat文件如何执行
绝对路径,"/home/myDir/xxx.bat" OR 所在的目录,:"./xxx.bat".
- zzulioj - 2618: ACM-ICPC亚洲区域赛ZZULI站
题目链接; http://acm.zzuli.edu.cn/problem.php?id=2618 题目描述 玩了这么多游戏,V决定还是去做几道ACM题练练手,于是翻到了一道201X年ACM/ICPC ...
- VS中的Modules窗口
当我在别人的机器上调试问题时,我做的第一件事就是查看modules窗口.按版本排序并看到一个不属于的dll可以帮助立即诊断配置问题,并节省许多调试痛苦. 下面介绍下各列的意思: Name:模块名称. ...
- Codeforces Round #605 (Div. 3) E - Nearest Opposite Parity (超级源点)