第03次作业-栈和队列

Posted 吴修恩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第03次作业-栈和队列相关的知识,希望对你有一定的参考价值。

1.学习总结

 

2.PTA实验作业

2.1题目1:符号配对

    

2.2 设计思路       

   定义全局变量int flag=1        
   int len;
  char a[1000];
  Stack s; s
=createstack(200); while(1){ 输入字符串 if(当字符串第一个元素为‘.’)跳出循环; if(flag==0)continue;//未遇到\'.\'时继续循环 读取字符串长度len; int i=0; for(当i小于长度len){ if(a[i]==\'(\'||a[i]==\'[\'||a[i]==\'{\'){ 将a[i]入栈; } else if(a[i]==\'/\'&&a[i+1]==\'*\'){ a[++i]=\'<\';//将/*转化为< 将a[i]入栈; } else if(a[i]==\')\'||a[i]==\']\'||a[i]==\'}\'||a[i]==\'*\'&&a[i+1]==\'/\'){ if(a[i]==\'*\'&&a[i+1]==\'/\') a[++i]=\'>\';//将*/转化为> if(flag==1)比对栈顶元素的括号是否与a[i]相匹配; } if(flag==0)break;//当flag为0时说明符号不匹配,跳出循环   } }
return 0;

 

2.3代码截图

    

2.4PTA提交列表说明

第五个测试点一直无法过,直到我将/*转化为<,*/转化为>,才通过测试。

 

 

2.1题目2:报数游戏

2.2 设计思路 

    int n,m;//n为游戏人数,m为退出圈子的位次
    输入n,m;
    if(当m大于n时){
        输出"error!";
        return 0;
    }
    建立空队列q;
    int i=1;
    while(i小于等于n){
        将1到n依此入队;
    }
    int j=m;//用来更新m
    int k;//记录出队的元素
    while(当队列不为空){
        while(--m){
            将前队列的头移到队列尾;
        }//将m个数移到队列尾
        if(当队列中只有一个元素时){
            输出该元素;   
            跳出循环;
        }
        else{
            删除队列头元素,并输出该元素;
        }
        m=j;//更新m的值使它为原来的退出位次
    }
  return 0;

 

2.3代码截图

2.4PTA提交列表说明

本以为自己输出的最后没有空格,经再三检查终于发现判断语句中出现了一些问题,我把(队列只剩下最后一个元素)判断写成了(队列为空)

 

2.1题目3:银行排队问题之单队列多窗口服务

 

2.2 设计思路 

    建立一个队列q;
    int i,n,h;
    输入顾客人数n;
    for(i=0;i<n;i++){
        将处理时间超过60的,改为60
        将顾客到达时间和处理时间入队
    }
    输入窗口数h;
    int wait=0,maxw=0;//等待时间和最长等待时间
    double sum=0;//等待总时长
    int win[11]={0},num[11]={0};//记录窗口完成时长和窗口接待人数
    while(当队列不为空){
        int m1=0,m2=99999,flag=0;//m1最快完成的窗口下标,m2记录最快完成时长,flag判断是否需要等待
        for(i=0;i<h;i++)//遍历每个窗口
     {
            if(若顾客的到达时间q.front().t >= 窗口的处理完成的时长win[i]){
                num[i]++;//该窗口处理人数加一
                win[i]=q.front().t+q.front().p;//该窗口处理完成时间更新
                出队;
                flag=1;//不需要等待
                break;
            }
            if(m2>win[i]){
          记录最快完成的窗口下标m1和等待时间m2
            }
        }
        if(当flag==0时)//需要等待
     {
            wait=win[m1]-q.front().t;//等待时间
            if(wait>maxw)maxw=wait;//对比每次的等待时间,找到最长的等待时间
            sum=sum+wait;//更新等待总时长
            win[m1]=win[m1]+q.front().p;//最快完成窗口的处理时长更新
            num[m1]++;
            出队;
        }
    }
    int ltime=0;//最后完成时长
    for(i=0;i<h;i++){
        遍历所有窗口,找到最长的完成时间win[]
    }
     输出平均等待时间sum/n、最长等待时间maxw、最后完成时间ltime
   输出各个窗口的服务人数num[]
    return 0;

2.3代码截图

 

2.4PTA提交列表说明

两处错误是因为我判断队头顾客无需等待时,未跳出循环,导致flag无法判断队列的下个元素是否需要等待

 

即缺少了break。

 

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

3.1栈PTA排名

 

 

3.2队列PTA排名

 3.3我的总分:2.5

 必做题做完选做做部分。

 

4. 阅读代码

 

代码功能:中缀表达式转化为后缀表达式

代码优点:1代码简洁。2用map将符号的优先级改为用数字表示,更易理解。

代码链接:https://www.cnblogs.com/8023spz/p/7635353.html

5. 代码Git提交记录截图

 

以上是关于第03次作业-栈和队列的主要内容,如果未能解决你的问题,请参考以下文章

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列