栈和队列
1.本周学习总结
学习C++后,相比较于C,C++比较容易实现栈和队列的操作,像是开挂一样,而徒手用C写的话太繁琐了
栈和队列有区别,前者是后进先出,后者是先进后出
其次呢,栈是一端受限,一段允许进行操作的线性表。先放的后取,后放的先取。放在栈上说,就是先进后出。
队列是一种限定性的线性表。先进先出。
和栈一样,它常见的两种存储是顺序存储和链式存储。
2.PTA实验作业
2.1.题目1:
本题要求在一个数组中实现两个堆栈。
2.1.2代码截图
2.1.3本题PTA提交列表说明
Q1:输出超限
A1;在申请完空间后,忘记修改S->MaxSize的值,导致输出超限
2.2.题目1:
如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,
而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。
2.2.2代码截图
2.2.3本题PTA提交列表说明
A1:忽略了循环,在增加减少的时候应该修改count的值,还要保证添加的位置不超多MaxSize
A2:输出用puts(), puts() 和 printf() 相比也有一个小小的缺陷,就是如果 puts() 后面的参数是字符指针变量或字符数组,
那么括号中除了字符指针变量名或字符数组名之外什么都不能写。
2.3.题目1:
假设表达式中允许包含3种括号:圆括号、方括号和大括号。即(,[,'{'。
编写一个算法判断表达式中的括号是否正确配对, 要求利用栈的结构实现。
2.3.1设计思路
先遍历所输入的数据,遇到{,(,【就入栈,遇到},),】先判断栈内是否为空,若为空,则不配对,若不为空,则取栈顶,
与之配对,配对成功就继续,知道数据全部配对完,在判断栈内是否还有元素,有则配对失败,无则成功。
2.3.2代码截图
2.3.3本题PTA提交列表说明
Q1:一个很容易遗忘的点,就是遇到右符号,但是栈里为空的情况
A1:通过pta的提示,在遇到右符号时,多加一条对栈的判断
2.4.题目1:
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子;
下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。其中n是初始人数;m是游戏规定的退出位次
(保证为小于n的正整数)。要求用队列结构完成。输出数字间以空格分隔,但结尾不能有多余空格。
2.4.1设计思路
首先判断m是否大于n,是则结束;不是则将数据输入到队列里,设置变量i,当i==m,输出队头并且出队,不等于就出队在入队
2.4.2代码截图
2.4.3本题PTA提交列表说明
A1;这题上课刚刚见过简化版本,回来就开始打,所以问题不大,编译错误只是忘记换C++;
C++处理这类题真的比C快捷很多
```
#3、栈和队列上机考试
##错题一
```
如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。
```
错误代码

正确代码

```
错误在处理输出的时候是输出队头,没有找好队头的位置
导致代码崩溃,在考试时也不能冷静思考,对队列的理解不够
也受到插入的影响,使得输出的代码有点乱。
```
##错题二
```
输入一个后缀表达式,程序求出表达式值。
```


```
这题pta上没有,是课本上的,当时也没有认真看,导致上机手足无措。当时写这题时就想着混点分就好,结果没混到,
就想把前面的队列写出来。
```