7:15~7:20 打卡学习
9:00~11:00 复习物理
13:00~15:00 记单词
16:00~20:00 复习队列和栈
其实呢,我一直都对队列和栈比较懵逼,但是昨天用C语言写二叉树的时候得用到这两个知识,而且今天经师父提醒才发现自己落下了一个栈和队列的数组,于是乎今天的刷题时间用来恶补栈和队列的知识
第一,C语言里没有特别定义队列和栈,我们在C语言里用到的队列和栈是通过数组和结构体模拟的
第二,虽然栈和队列都属于数据结构,但是栈是后进先出,并且只能在一端进行 插入和删除操作;而对于队列,它是一种先进先出的数据结构,并且只允许在队列的首部进行删除操作(出队),只能在队列的尾部进行插入操作(入队)。
第三,分别用C语言建立栈和队列
队列
struct queue
{
int q[1000];
int head;//用来记录队列首部下标
int tail;//用来记录队列尾部下标
}Q;
//入队操作
scanf("%d",&Q.q[Q.tail++]);
//出队操作
Q.head++;
PS:需要注意的是tail的值应该是数组最后一个有效元素的下标加一,而当head==tail时该队列为空,为什么要这么规定呢,书上说的是当队首和队尾重合时会带来一些麻烦,这让我不禁联想到了另一种数据结构——链表。
栈
int a[100];
int tap=0;//栈顶
//入栈
scanf("%d",&a[tap++]);
//出栈
printf("%d,a[tap--]);
话说小栈同学看上去比队列亲善友好很多呀,这不就是一个数组加一个记录下标的变量么。
其实讲了这么多就算理解了也只是明白了些理论知识,反正我刚看完队列和栈的定义的时候我着实看不出来这两货能用来干啥,所幸啊哈算法在讲完这俩的定义后紧跟着一道需要用到栈和队列的题,打消了我心中的疑惑。
题目的大概意思就是两个小盆宇玩扑克牌游戏“钓鱼”(我们那叫“拖拉机”),让你根据二人的起手牌判断最后谁会赢(不明白规则的去网上查查)。
代码难度不高我就不敲了,大致思路就是分别建立两个队列用来存放这两个人的牌,用一个栈来存放桌面上的牌(最后出的牌放到栈顶),能“钓鱼”就进行相应的出队、入栈、出栈、入队操作,不能“钓鱼”就直接出队、入栈,以此循环,吧啦吧啦。。。。。。
今天的学习又结束了,总计7小时,毕竟是复习之前的内容,今天的学习相对来说还是比较休闲轻松的。
啦啦啦,晚安啦。。。。。。