《啊哈!算法》笔记_Day02
这篇先写前三节,下一篇在把这一张剩下的写完
第2章 栈、队列、链表
- 第一节 解密QQ号——队列
- 第二节 解密回文——栈
- 第三节 纸牌游戏——小猫钓鱼
第一节 解密QQ号——队列
这一节通过解密一个QQ号来引入队列,解密这个QQ号的方法是首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数放到这串数的末尾,再将第5个数删除……知道剩下最后一个数,将最后一个属也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小哈的QQ。
队列有两个变量,两个整型变量head和tail。head记录队列的队首(即第一位),tail用来记录队列的队尾(即最后一位)的下一个位置。
注意:head指向的是第一位,但tail指向的却不是最后一位,而是最后一位的下一位,因为当队列只剩下一个元素时,head和tail会重合,会带来麻烦。
队首和队尾重合时,队列为空。
删除一个数:head++
增加一个属:q[tail]=num;tail++;
书中将数组的0号元素赋值为0,即将0号元素去除,从1号开始,方便计数,且将数组定义为102个,这里我将代码稍稍改动。
#include <stdio.h>
int main()
{ int q[20]={6,3,1,7,5,8,9,2,4},head,tail; int i; //初始化队列head=0; tail=9; //队列中已经有9个元素了,tail指向队尾的后一个位置 while(head<tail) //当队列不为空的时候执行循环{ //打印队首并将队首出队printf("%d ",q[head]); head++; //先将新队首的数添加到队尾q[tail]=q[head]; tail++; //再将队首出队head++; } getchar();getchar(); return 0;
}
队列时一种特殊的线性结构,只允许在队列的首部(head)进行删除操作,称为“出队”;而在队列的尾部(tail)进行插入操作,称为“入队”。当队列中没有元素时(head==tail),称为空队列。
队列,先进先出(First In First Out,FIFO)
将队列的三个基本元素(一个数组,两个变量)封装为一个结构体类型,代码如下:
struct queue
{ int data[100];//队列的主体,用来存储内容int head;//队首int tail;//队尾
};
//定义结构体类型,通常将其放在main函数的外面
//注意结构体的定义末尾有个;
//
定义结构体变量:
struct queue q;
//struct queque 是一个整体,不能直接写queque q;
//使用成员运算符(点号运算符)来访问结构体变量的成员
下面是完整的使用结构体来实现的队列操作。
#include <stdio.h>
struct queue
{ int data[100];//队列的主体,用来存储内容int head;//队首int tail;//队尾
}; int main()
{ struct queue q; int i; //初始化队列q.head=0; q.tail=0; for(i=1;i<=9;i++) { //依次向队列插入9个数scanf("%d",&q.data[q.tail]); q.tail++; } while(q.head<q.tail) //当队列不为空的时候执行循环{ //打印队首并将队首出队printf("%d ",q.data[q.head]); q.head++; //先将新队首的数添加到队尾q.data[q.tail]=q.data[q.head]; q.tail++; //再将队首出队q.head++; } getchar();getchar(); return 0;
}
第二节 解密回文——栈
本节通过判断是否是回文来引入栈的概念,判断回文的方法,先将要判断的字符前一半如栈,然后当前栈的字符依次出栈,看能否与后一半字符依次匹配,匹配即回文。
栈:后进后出,只能在一端进行插入和删除操作。
栈只需要一个一维数组和一个指向顶栈的变量top,通过top来对栈进行插入和删除操作。
因为top指向的是当前栈顶的变量,所以进栈的代码是:
s[++top]=a[i];
//先将top指向下一个位置,然后赋值
下面是书中判断是否回文的代码:
#include <stdio.h>
#include <string.h>
int main()
{ char a[101],s[101]; int i,len,mid,next,top; gets(a); //读入一行字符串len=strlen(a); //求字符串的长度mid=len/2-1; //求字符串的中点top=0;//栈的初始化//将mid前的字符依次入栈for(i=0;i<=mid;i++) s[++top]=a[i]; //判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标 if(len%2==0) next=mid+1; else next=mid+2; //开始匹配for(i=next;i<=len-1;i++) { if(a[i]!=s[top]) break; top--; } //如果top的值为0,则说明栈内所有的字符都被一一匹配了if(top==0) printf("YES"); else printf("NO"); getchar();getchar(); return 0;
}
堆栈最早由 Alan M. Turing(艾伦·图灵)于 1946 年提出,当时是为了解决子程序的调用和返回。艾伦·图灵这个大帅哥可是个大牛人,图灵奖就是以他的名字命名的。如果你对他感兴趣不妨去读一读《艾伦·图灵传:如谜的解谜者》和《图灵的秘密》。
第三节 纸牌游戏——小猫钓鱼
本节是由我们小时候玩的游戏,小猫钓鱼引入,这个游戏大概就是两个人一人一摞纸牌,按照一定顺序,往上放牌,如果与之前放过的牌一致,就可以把这两张牌之间的牌拿走(包括这两张牌本身)放到自己手中牌的后面,最后手里没有牌的一方为输。
这个游戏相信大家小时候都玩过,但是用代码来模拟这个游戏怎么实现呢,让我们来看一下吧:
#include <stdio.h>
struct queue
{ int data[1000]; int head; int tail;
}; struct stack
{ int data[10]; int top;
}; int main()
{ struct queue q1,q2; struct stack s; int book[10]; int i,t; //初始化队列q1.head=1; q1.tail=1; q2.head=1; q2.tail=1; //初始化栈s.top=0; //初始化用来标记的数组,用来标记哪些牌已经在桌上for(i=1;i<=9;i++) book[i]=0; //依次向队列插入6个数//小哼手上的6张牌for(i=1;i<=6;i++) { scanf("%d",&q1.data[q1.tail]); q1.tail++; } //小哈手上的6张牌for(i=1;i<=6;i++) { scanf("%d",&q2.data[q2.tail]); q2.tail++; } while(q1.head<q1.tail && q2.head<q2.tail ) //当队列不为空的时候执行循环{ t=q1.data[q1.head];//小哼出一张牌//判断小哼当前打出的牌是否能赢牌if(book[t]==0) //表明桌上没有牌面为t的牌{ //小哼此轮没有赢牌q1.head++; //小哼已经打出一张牌,所以要把打出的牌出队s.top++; s.data[s.top]=t; //再把打出的牌放到桌上,即入栈book[t]=1; //标记桌上现在已经有牌面为t的牌} else { //小哼此轮可以赢牌q1.head++;//小哼已经打出一张牌,所以要把打出的牌出队q1.data[q1.tail]=t;//紧接着把打出的牌放到手中牌的末尾q1.tail++; while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放到手中牌的末尾{ book[s.data[s.top]]=0;//取消标记q1.data[q1.tail]=s.data[s.top];//依次放入队尾q1.tail++; s.top--; //栈中少了一张牌,所以栈顶要减1 } } t=q2.data[q2.head]; //小哈出一张牌//判断小哈当前打出的牌是否能赢牌if(book[t]==0) //表明桌上没有牌面为t的牌{ //小哈此轮没有赢牌q2.head++; //小哈已经打出一张牌,所以要把打出的牌出队s.top++; s.data[s.top]=t; //再把打出的牌放到桌上,即入栈book[t]=1; //标记桌上现在已经有牌面为t的牌 } else { //小哈此轮可以赢牌q2.head++;//小哈已经打出一张牌,所以要把打出的牌出队q2.data[q2.tail]=t;//紧接着把打出的牌放到手中牌的末尾q2.tail++; while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放到手中牌的末尾{ book[s.data[s.top]]=0;//取消标记q2.data[q2.tail]=s.data[s.top];//依次放入队尾q2.tail++; s.top--; } } } if(q2.head==q2.tail) { printf("小哼win\n"); printf("小哼当前手中的牌是"); for(i=q1.head;i<=q1.tail-1;i++) printf(" %d",q1.data[i]); if(s.top>0) //如果桌上有牌则依次输出桌上的牌{ printf("\n桌上的牌是"); for(i=1;i<=s.top;i++) printf(" %d",s.data[i]); } else printf("\n桌上已经没有牌了"); } else { printf("小哈win\n"); printf("小哈当前手中的牌是"); for(i=q2.head;i<=q2.tail-1;i++) printf(" %d",q2.data[i]); if(s.top>0) //如果桌上有牌则依次输出桌上的牌{ printf("\n桌上的牌是"); for(i=1;i<=s.top;i++) printf(" %d",s.data[i]); } else printf("\n桌上已经没有牌了"); } getchar();getchar(); return 0;
}
最后来个个人小总结吧:
1.队列:先进先出(后进后出),需要三个变量,一个数组(用来存放数据),一个head变量(记录队列的队首),一个tail变量(记录队列的队尾的下一个位置)
2.栈:后进先出(先进后出),需要两个变量,一个数组(用来存放数据),一个top变量(指向栈顶)
谢谢你的坚持阅读ovo哟,让我们一起加油吖
《啊哈!算法》笔记_Day02相关推荐
- 《算法笔记》中文版 - 包括数组,链表,树,图,递归,DP,有序表等相关数据结构与算法的讲解及代码实现...
来源:专知本文为资源,建议阅读5分钟本文为你分享<算法笔记>中文版. https://github.com/Dairongpeng/algorithm-note 目录概览 第一节 复杂度. ...
- 数据结构与算法笔记 - 绪论
数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...
- 数据结构与算法笔记(十六)—— 二叉搜索树
一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...
- 数据结构与算法笔记(十五)—— 散列(哈希表)
一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...
- 《algorithm-note》算法笔记中文版正式发布!
无论是做机器学习.深度学习.自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理.掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版 ...
- 【算法】《algorithm-note》算法笔记中文版正式发布!
无论是做机器学习.深度学习.自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理.掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版 ...
- c++ string 删除字符_算法笔记|(5)第二章C、C++的快速入门字符数组的存放方式string.h文件...
字符数组的存放方式 由于字符数组是由若干个char类型的元素组成的,因此字符数组的每一位都是一个char字符,除此之外,在一维字符数组或者二维字符数组的第二维的末尾都有一个空字符\0表示存放的字符串的 ...
- 算法笔记(JavaScript版)——排序
算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...
- 三维重建7:Visual SLAM算法笔记
VSLAM研究了几十年,新的东西不是很多,三维重建的VSLAM方法可以用一篇文章总结一下. 此文是一个好的视觉SLAM综述,对视觉SLAM总结比较全面,是SLAM那本书的很好的补充.介绍了基于滤波器的 ...
- 最优化理论与算法笔记
最优化理论与算法笔记
最新文章
- java多线程-阻塞队列BlockingQueue
- 子集和的目标值(codevs 1692)
- AE教程:学会这个,你做的Logo就可以单独出道了
- 【Python-ML】SKlearn库Pipeline工作流和K折交叉验证
- 『ES6』ES6 - 学习笔记
- android普通权限说明,Android权限说明.doc
- 上传问题分析1--文件保存位置
- 十强决赛即将拉开帷幕!TECHSPARK星星之火IT创新大赛诚邀您观赛
- word 代码块_如何优雅的写好 Pythonic 代码?
- 从竞品数据搜集切入,NiucoData要做商业情报追踪分析工具
- 面试官系统精讲Java源码及大厂真题 - 11 HashSet、TreeSet 源码解析
- Altium Designer画元器件封装三种方法
- Vaadin介绍与开发练习之二(创建第一个Vaadin类)
- 计算机网络使用双绞线连接时,计算机网络技术期末试卷A
- FlightGear的IO系统
- 智能交通系统系统中的车牌识别技术
- 6. Manage the driver for browser and the script for Hub
- 【优化算法】简述灰狼优化算法(GWO)原理
- 帝国cms 7.5 utf8集成百度编辑器完美集成版
- 【积跬步以至千里】Markdownpad2报错: Html Rendering Error:An error occurred with the HTML rendering component。
热门文章
- Ubuntu 18.04 如何添加或删除 SWAP 交换分区
- 数组的partition调整
- BERT论文阅读(二): CG-BERT:Conditional Text Generation with BERT for Generalized Few-shot Intent Detection
- 深度学习~图神经网络GNN
- torch_geometric 笔记:nn.ChebNet
- 强化学习笔记:Policy-based Approach
- 运筹学最优化理论系列概念-单纯形法原理解析
- ORACLE数据库安装图文教程
- matlab破损皮革定位,皮革下料
- Plotly绘制树状热力图(treemap)【Plotly实例教程】