博客作业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提交记录截图