DS博客作业03--栈和队列

栈和队列

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记录队列中元素个数。请编写算法实现队列的入队和出队操作。
```
错误代码
![](https://img2018.cnblogs.com/blog/1474675/201904/1474675-20190427143018113-188608911.png)

正确代码
![](https://img2018.cnblogs.com/blog/1474675/201904/1474675-20190427143040060-1781263315.png)

```
    错误在处理输出的时候是输出队头,没有找好队头的位置
导致代码崩溃,在考试时也不能冷静思考,对队列的理解不够
也受到插入的影响,使得输出的代码有点乱。
```

##错题二
```
输入一个后缀表达式,程序求出表达式值。
```
![](https://img2018.cnblogs.com/blog/1474675/201904/1474675-20190428192904122-1051998231.png)

![](https://img2018.cnblogs.com/blog/1474675/201904/1474675-20190427143352515-237722429.png)

```
    这题pta上没有,是课本上的,当时也没有认真看,导致上机手足无措。当时写这题时就想着混点分就好,结果没混到,
就想把前面的队列写出来。
```
原文地址:https://www.cnblogs.com/B-hai/p/10745516.html