博客作业03--栈和队列

1.学习总结(2分)

2.PTA实验作业(4分)

注意:本次及以后的作业代码均需提交到Git仓库进行保存与未来的检查,并在学习总结小节截图你的提交记录。请立刻规划好存放你代码的目录结构,每次写完一题提交一次。具体提交方式请参见本周学习总结。
具体书写内容及格式如下:

2.1 题目1:7-1 jmu-字符串是否对称

2.1.1 伪代码描述

1.定义栈变量S,字符变量ch,数组a【】存放字符串;
2.输入字符串到数组a;
3.字符串入栈(入栈函数)
           定义循环变量i;
             for  i=0  to  a【i】!=‘\0’;
           将数组中的元素入栈到栈中;
            end for;
         将栈的长度定义为数组的长度;
4.比较数组和栈的字符串是否相等(比较函数)
         定义循环变量 i,flag=0;
            for  i=0 to  栈的长度;
            如果数组和栈元素不同
                 输出no;flag=1;退出;
           否则
                  指针top--;
          end for;
         如果flag=0;说明没有不同的元素,输出yes;

2.1.2 代码截图


2.1.3 PTA提交列表说明。

  • 一开始在输入字符到数组时,我用的是while,所以一直段错误,虽然 不知道为什么,但是后来换成gets输入的时候就不会段错误了。
  • 后来一直部分正确,是在比较函数的时候我一开始当判断出no的时候就break,没有用flag判断,后来加了flag判断就正确了。

2.2 7-1 jmu-报数游戏

2.2.1伪代码描述

1.定义变量m,n;
2.输入n,m;如果m>n,输入错误,cout<<“error”,退出;
3.(按题意输出函数)
      定义循环变量i,j,k=1,e存放数据;
     queue<int>Q;
               for i=0  to  n;
                     将i+1值进队列;
                end for;
         while(k<n)
                for  j=0  to  m;
                  每循环m次输出一个数据;
                  输出一个删一个;
                不到m次的时候该数据重进队列;
                 end for;
              循环变量k++;
         end while;
    输出最后一个数据,不加空格;

2.2.2代码截图

2.2.3 PTA提交列表说明。

  • 一开始,不知道用queue,所以打的很辛苦也有很多错误,后来用queue就没有什么错误了。

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

2.3.1伪代码描述

1.定义数据总数变量count,循环变量i,k=1,数据变量number,判断变量flag=0;
2.输入count;
  queue<int>Q1,Q2;
3.使用for循环,依次输入数据进队列Q1;
4.使用for循环,依次将Q1中的偶元素分到Q2中;
5.while(k<count)
         if(flag<2){
      如果(Q1不为空)
        连续输出两次Q1的数据;
       flag++;
       }
      如果(Q2不为空)
         输出一次Q2的数据;
         flag=0;
     
      循环变量k++;
    end while;
6.如果(Q1不为空)输出最后一个不加空格的数据;
7.如果是(Q2不为空){
         while(Q2的数据元素不等于1)输出Q2的数据加空格;
       输出最后一个不加空格的数据;
   }
8。return 0;

2.3.2代码截图

2.3.3PTA提交列表截图

  • 一开始是flag=0写成flag==0;部分正确;
  • 第二个是输出最后一个元素的时候,Q1有剩只会剩一个元素,但是Q2却不一定,所以在while循环结束后的输出,对于Q2的写法不同于Q1,调试后找到错误并改正;

3.1 栈PTA排名

3.2 队列PTA排名

3.3 我的总分:

155

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

#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
struct node
{
   int t, p;//到达时间,处理时间 
};
int main()
{
  int n;
  cin>>n;
  queue <node> q;
  int i;
  for(i = 0; i < n; i++){// 将输入的数入队列 
     node tmp;
      cin>>tmp.t>>tmp.p;
      if(tmp.p > 60) tmp.p = 60;//根据题意,最大处理时间为60 
	     q.push(tmp);
       }
  int k;
  cin>>k;//k个窗口 
  int win[15] = {0}, num[15] = {0};//完成时间,窗口人数 
  int wait = 0, maxn = 0, sum = 0;//单次等待时间,最长等待时间,总的等待时间 
  while(!q.empty()){
    int flag = 0;
    int minn = 9999, imin = 0;//最快完成时间,最快完成时间的下标 
      for(i = 0; i < k; i++) {//遍历k个窗口 
               if(win[i] <= q.front().t) {
                     win[i] = q.front().t + q.front().p;// 更新完成这个窗口完成的时间
                      num[i]++;//窗口人数加一
                     flag = 1;// 标记一下,代表不需要等待
                      q.pop();// 队列首位除去
                      break;
                }
               if(minn > win[i]){//如果需要等待,就记录各个窗口里最快完成的那个窗口的完成时间,和下标
                    minn = win[i];
                    imin = i;
                }
        }
    if(flag == 0){// 需要等待
        wait = win[imin] - q.front().t;// 等待的时间,最快完成的时间减去队列第一个人到达的时间
        win[imin] += q.front().p;
        if(maxn < wait) maxn = wait;
        sum += wait;
        num[imin]++;
        q.pop();
    }
   }
   
  int last = win[0];
    for(i = 0; i < k; i++){
        if(win[i] > last) last = win[i];// 求最大完成时间
    }
  printf("%.1lf %d %d\n", sum * 1.0 / n * 1.0, maxn, last);//输出 
   for(i = 0; i < k; i++){
        cout<<num[i];//输出各窗口人数 
        if(i != k - 1) cout<<" ";
        else cout<<endl;
  }
  return 0;
}
  • 这道题是网搜的银行排队单队列多窗口

5. 代码Git提交记录截图


posted @ 2018-04-14 20:29  一叶落而秋将至  阅读(274)  评论(4编辑  收藏  举报