博客作业03--栈和队列

1.学习总结(2分)

1.2 使用思维导图将这些关键词组织起来

1231987-20180414122002866-2064538424.png

2.PTA实验作业(4分)

2.1 题目1:表达式转换

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

2.2 设计思路(伪代码或流程图)

初始化运算符栈op;
将'='进栈; 
从exp读取字符ch;
while(ch!='\0'){
    if(ch不为运算符)
        将后续的所有数字依次存放到postexp中,并以' '标志结束
    else
        switch(Precede(op栈顶运算符,ch)){
            case '<':
                将ch进栈;
                从exp读取下一个字符ch;
                break;
            case '=':
                退栈; 
                从exp读取下一个字符ch;
                break;
            case '<':
                退栈运算符并将其存放到postexp中; 
                从exp读取下一个字符ch;
                break;
        } 
}
exp扫描完毕,退栈到'='为止;

2.3 代码截图

1231987-20180413224952687-964512002.png
1231987-20180413224959313-348665910.png

2.4 PTA提交列表说明。

  • 得分情况:0 -> 1 -> 5 -> 23
  • 格式错误:题目要求结尾不得有多余空格
    解决方法:控制结尾,不输出空格

1231987-20180413230202152-1339859856.png

  • 段错误:有非整数出现情况没有考虑
    解决方法:添加判断有小数的情况

1231987-20180413230233470-518414545.png

  • 运行时超时:postexp数组越界
    解决方法:题目提到表达式不超过20个字符,因此开始时设为postexp[20],但是我的postexp数组中还包括了空格,因此空间不够,改为postexp[50]

1231987-20180413230839558-1608907857.png

  • 答案错误:运算数前有正负号
    解决方法:未解决

2.1 题目2:银行业务队列简单模拟

设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。

2.2 设计思路(伪代码或流程图)

void CreateQueue(SqQueue &Q1,SqQueue &Q2,int N){ 
    定义num为顾客编号
    for i=0 to N
    {
        输入顾客编号num
        偶数顾客进队Q2,奇数顾客进队Q1           
    } 
} 

void PrintfQueue(SqQueue &Q1,SqQueue &Q2,SqQueue Q3,int N)
{
    while(Q1,Q2都不为空队时 ){ 
        奇数顾客两名,偶数顾客一名,依次出队并进队Q3 
    }
    Q1或Q2队列中有剩余的顾客出队并进队Q3
    输出顾客编号 
       
} 

2.3 代码截图

1231987-20180414004441130-1743386922.png
1231987-20180414004446793-182328687.png

修改后代码:
1231987-20180418215139192-645602541.png

2.4 PTA提交列表说明。

  • 得分情况:23 -> 25

1231987-20180414004602754-567786901.png

  • 答案错误:最大N情况,答案错误
    解决方法:N(≤1000)为顾客总数,所以把#define MAXQSIZE 100 改为#define MAXQSIZE 10001

  • 一个在写代码时遇到的错误
    错误:找到有剩余顾客的队列后进行出队并入队Q3,但只输出一个顾客的编号,又试了一组数据还是同样的情况。

1231987-20180414005625300-1793847198.png
1231987-20180414005631157-128477071.png

解决方法:说明在最后剩余顾客入队进Q3的部分出错,发现是没有对有剩余顾客的队列进行遍历,导致入队Q3只执行了一次。
改正后代码:

1231987-20180414010552132-302145844.png

2.1 题目3:报数游戏

报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。要求用队列结构完成。输出数字间以空格分隔,但结尾不能有多余空格。

2.2 设计思路(伪代码或流程图)

输入人数n;
for  i=1 to n
    元素 i 进队

void Game(SqQueue &Q, int m){//报数游戏 
    if(m>总人数){
        输出error,退出
    }      
    遍历队列{  
        if(报的数小于m){
            该人出队再入队,改变头尾指针位置
        }
        else if(报的数为m){
            出队并输出编号;
            从头开始报数;
        }
    }

} 

2.3 代码截图

1231987-20180414153707310-122644465.png

2.4 PTA提交列表说明。

  • 得分情况:15(本题出现的问题在devc上修改正确)

  • 错误:输出没有内容
    1231987-20180414154527425-83463566.png
    1231987-20180414154535441-909469984.png
    1231987-20180414154542539-152026793.png

发现问题及解决方法:调试发现程序一直在以下部分循环,发现 i 没有改变,于是加上i++;,并在找到报数为m的人后重头开始报数,令i=0;
1231987-20180414154713686-1557450983.png

改正后代码:
1231987-20180414155918590-2044161688.png

3.截图本周题目集的PTA最后排名(3分)

3.1 栈PTA排名

1231987-20180414160528066-530923405.jpg

3.2 队列PTA排名

1231987-20180414160537558-427378933.jpg

3.3 我的总分:78+80=158(2分)

4. 阅读代码(必做,1分)

代码功能:堆栈模拟队列 (两个堆栈S1和S2,用这两个堆栈模拟出一个队列Q。)
代码理解:将栈s1里的全部元素出栈,并入栈到栈s2,出栈栈s2的栈顶元素,得到队头元素
1231987-20180418222802594-1033700880.jpg

代码地址:[https://gitee.com/zhoubinghui/data_structure/blob/master/队列/7-5%EF%BC%88选做%EF%BC%89%20堆栈模拟队列.cpp]

  • 利用#include<bits/stdc++.h>包含C++的所有头文件,比较方便
  • 利用#include<stack>,可以不用写Pop、Push等函数,使代码更简洁

1231987-20180414172251460-455351275.png

5. 代码Git提交记录截图

在码云的项目中,依次选择统计-Commits历史-设置时间段,进行搜索并截图,如下图所示,需要出现学号、项目提交说明。请在码云中将你的昵称改为“学号-姓名”。

1231987-20180414191850252-2081737368.png

转载于:https://www.cnblogs.com/smtwula/p/8824251.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值