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

1.本周学习总结

栈和队列是常见的数据结构,是两种非常重要的线性结构,也都是线性表,它们都是操作受限的线性表,有顺序栈、链式栈、链式队列和循环队列等形式。
其中,栈是一特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。在对栈进行出入栈操作时要先判断栈是否空或者满的情况
(但是在链式栈中一般不会出现溢出情况,所以进栈时不用判断是否栈满)。
队列也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队尾(rear),允许插入的一端称为队头(Front)。队列中也会出现“假溢出”的现象,这种现象造成的空间浪费,用循环队列一般可以解决。队列在生活中也有很多应用,像银行排队以及模拟打印机缓冲区等都可以运用队列的知识来解答。

2.PTA实验作业

2.1.题目1:另类堆栈(函数题)

2.1.1设计思路

进栈函数
.先判断栈是否是满的
     是,则返回false;
     否则,进行进栈操作,即让栈顶指针top++,然后把要进栈的值赋给S->data[s-top];
     返回true;
出栈函数
.先判断栈是否为空
    是,返回ERROR;
    否则,进行出栈操作,即把要出栈的值返回到主函数中去

2.1.2代码截图

2.1.3本题PTA提交列表说明。

Q:这道题其实就是简单的栈的基本出入栈操作,但是一开始写的时候对栈还不了解
在出栈的时候先进行了S->top--操作, 所以出现了错误。

2.2.题目2:7-1 jmu-字符串是否对称(编程题)

2.2.1设计思路

把要判断的字符串里的每个字符都放到栈里,然后再从栈输出,这样就得到了一个逆序字符串,再把初始字符串和逆序字符串作比较,
如果比较的结果是一样时,就说明这个字符串是一个对称字符串

2.2.2代码截图


2.2.3本题PTA提交列表说明。

bool IsSeq(char *str,stack<char> &st)里的操作主要是将字符进栈,再出栈存放到到数组中。
.不懂#include <stack>的库函数怎么用,在出栈或者入栈时,没有在出入栈函数前加上栈的名称(st.pop()或者st.push());

2.3.题目3:舞伴问题(函数题)

2.3.1设计思路

函数体不要写设计思路。编程题用文字描述设计思路。(可不写伪代码)

2.3.2代码截图



2.3.3本题PTA提交列表说明。

.这道题要写的函数比较多,所以虽然前几个函数是队列的基本操作,但是也比较容易出现小错误。
在对列长度的函数里本该返回Q->rear-Q->front的,但是我一开始返回了Q->rear=Q->front。
入队时,队满的条件写错了。
.配对舞伴那个函数,其他部分都还好吧。就是在while循环的条件那一块,就考虑了一个性别队列长度为0的情况,然后
就一直答案都不正确

2.4.题目4:报数游戏(编程题)

2.4.1设计思路

这题主要是用循环队列的方法解,在m和n符合题意的条件下对所有的元素进行入队处理,在while循环中,当报数报到m时,元素出队。
然后再重新继续报数,以此类推。直到不符合条件的时候,结束循环。

2.4.2代码截图


2.4.3本题PTA提交列表说明。

.刚开始出现编译错误,在编译器上可以通过编译,但是提交到pta上显示错误,其实是我少了一条return 0语句
.后来当我在编译器上输入样例都得到正确结果的时候,然后无论我怎么提交都提示错误,然后拿代码到别的同学的
pta上又可以通过,我?????好吧,最后傻不愣登地发现是我没有选择C++的编译器。

3.栈和队列上机考试(-3--3分)

错题及解决办法

3.1错题一:符号配对

假设表达式中允许包含3种括号:圆括号、方括号和大括号。即(,[,'{'。编写一个算法判断表达式中的括号是否正确配对, 要求利用栈的结构实现。
这是一道在PTA上写过的题,实际上并不是很难。思路主要是遇到左括号时全部进栈,然后判断接下来的右括号与栈顶元素是否相匹配,若匹配则栈顶元素出栈,不匹配时则按题目要求输出“no”。
看到这道题的时候,我窃喜;敲完代码后提交后三个测试点就只过了两个测试点。纠结了很久还是没有发现自己错在哪了。回去的时候仔细看看之后发现是在判断左括号与栈顶元素是否匹配的时候出了问题。我没有用栈顶元素跟右括号进行比较判断,而是取了任意一个栈里的元素进行比较,所以错了。

代码截图(不完全正确的代码)





3.2错题二:银行业务队列简单模拟

设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
这也是在pta上的一道题,在pta上不会写,到了上机考试还是不会!(哭了~)。
回去之后问了同学自己又研究了一下,然后这道题需要建立俩队列去存放奇数号和偶数号。在队列不为空的条件下,分别输出奇数队首和偶数队首。
最后直到某个队列的元素全部出队完成,再把另一个还有剩余元素的队列的元素全部进行出队操作。

代码截图



原文地址:https://www.cnblogs.com/112Ada/p/10740318.html