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

1.本周学习总结

1.栈和队列是两种比较特殊的线性结构,栈具有先进后出的特点,操作时只对栈顶进行操作,队列具有先进先出的特点,操作时从队尾入队,从队头出队,而针对栈和队列的各种操作的时间复杂度均为O(1),利用这一点以及栈和队列的特点可以更加方便的解决问题。
2.随着对c++的深入学习,我也开始逐渐学会了容器的使用,每个容器都带有大量的预编译函数,利用这些函数可以有效的减少代码量,提高编程效率。

2.PTA实验作业

2.1.题目1:在一个数组中实现两个堆栈

本题要求在一个数组中实现两个堆栈。

2.1.1设计思路

栈的入栈和出栈算是基本操作了,就不多讲了,本题只不过是要注意一下两个栈的区别,入栈和出栈要分别进行操作

2.1.2代码截图

2.1.3本题PTA提交列表说明。


这道题算是一道基础题了,只不过刚开始做的时候我没有注意到这道题是用c而不是c++来做而导致出现了一些问题,以及没有注意到一些细节的错误

2.2.题目2:符号配对

请编写程序检查C语言源程序中下列符号是否配对:/*与*/、(与)、[与]、{与}。

2.2.1设计思路

先提起出源码中的需要判断的符号,再逐个判断这些符号,遇到左符号时入栈,遇到右符号时取栈顶符号来判断是否配对,若配对则将栈顶元素出栈,若不配对则输出栈顶元素并输出no同时结束程序,最后再判断栈是否为空,为空则输出yes,不为空则输出输出栈顶元素并输出no

2.2.2代码截图



2.2.3本题PTA提交列表说明。


这道题思路并不难,但麻烦的是//的判断,以开始这个问题也让我苦恼了许久,最后想到了将//转换为<和>来进行判断输出时再转换回来才解决了这道题

2.3.题目3:表达式转换

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

2.3.1设计思路

扫描整个表达式,遇到数字时写入表达式数组,遇到运算符时若栈为空或优先级大于栈顶元素则入栈,否则则将栈顶元素出栈并重复上一步操作,直到扫描完整个表达式,最后出栈所有元素

2.3.2代码截图





2.3.3本题PTA提交列表说明。


这道题最让我苦恼的地方就是负数的输出问题,输出时我一直无法区分负数的符号和减号的区别,最后将负数的符号写入表达式时转换为'?'输出时再转换回来才解决了这个问题。

2.4.题目4:银行排队问题之单队列多窗口服务

假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。

2.4.1设计思路

先将所有顾客入队,之后再将顾客逐个出队进行处理,用一个数组记录窗口处理完上一个事务的时间,再将顾客的到达时间与窗口处理完上一个事务的时间进行比较,若找到时间比顾客到达小的窗口则让顾客在该窗口处理事务,若未找到则让顾客在最早处理完事务的窗口处理事务,二者的时间差为顾客的等待时间,重复以上操作直到处理完所有顾客

2.4.2代码截图



2.4.3本题PTA提交列表说明。


这道题我一直忽略了顾客到达时间与窗口处理完事务时间相等的情况导致了最后一个点一直过不起,直到几天后看了其他人的代码才注意到了这个问题,更该后才过了全对。

3、栈和队列上机考试

错题1:6-1 在一个数组中实现两个堆栈

错误代码


我在做这道题时忘了是用c而不是c++来做,一直忽略了第一个函数初始完栈后要返回,直到考试快要结束时才注意到这个问题,匆忙改正后却发现自己之前更改过栈顶指针的位置,而剩余时间而以及不够更改了,这才导致我最终没有解决这道题,本题的正确做法我在上面的题目中有讲,就多说什么了

错题2:7-2 银行业务队列简单模拟

我在pta中有做对但在考试时来不及做的题,贴一下我在pta中的正确代码

错题3:7-3 列车调度

同样是我在考试时来不及做的题,在考试结束后我听舍友说过set容器并去学习了之后就用set容器解决了这道题

原文地址:https://www.cnblogs.com/xycm/p/10712486.html