博客作业03--栈和队列
1.学习总结
2.PTA实验作业
2.1 题目1: 银行业务队列简单模拟
2.2 设计思路:
定义两个队列A,B
输入N位顾客的编号,奇数编号入队A,偶数编号入队B
while(A和B都不为空)
循环两次输出A的队头元素,然后出队
输出B的队头元素,然后出队
whileB不为空
如果B的大小为1
输出队头元素,然后出队
否则
输出队头元素后加空格,然后出队
whileA不为空
如果A的大小为1
输出队头元素,然后出队
否则
输出队头元素后加空格,然后出队
2.3 代码截图:
2.4 PTA提交列表说明
部分正确:错误点卡在A.B队列一起输出完还有队列中有元素的情况,原来的思路比较麻烦,后来经过舍友提示通过判断队列里元素个数是否是一个来实现最后一个元素不带空格
2.1 题目2:jmu-报数游戏
2.2 设计思路:
输入 n , m //退圈数和总人数
if n>m
Error
结束程序
end
定义队列 q, 将m个人入队
int i= 1 //报数
while q.size()!=1
if( i%n==0 ||q.size()<n)
输出本轮退圈的人的编号
else 将队首放到队尾
i++
end
输出最后一个人的编号
2.3 代码截图:
2.4 PTA提交列表说明
编译错误:一开始有一步忘记将元素出队,导致编译错误无法运行
2.1 题目3:银行排队问题之单队列多窗口服务
2.2 设计思路:
struct node{
int T,P //到达时间,事务处理时间
}
输入n,k //顾客总数,窗口数
定义结构体队列q(前面定义结构体包含到达和处理事务时间)
遍历第一个到第n个顾客
建立节点t
输入T,P //到达时间,事务处理时间
if(t.P>60) t.P=60
将节点t入队
end
while !q.empty()==1
flag=1 //是否要等待标志
int mintime=9999,mint_=0 //最短等待时间,最短等待时间下标
遍历每个窗口
if 到达时间>该窗口最快完成时间
窗口完成时间=到达和处理时间之和
winnum[i]++ //窗口服务人数
flag=0 //标记不用等待
出队并退出循环
if 最快完成时间>该窗口完成时间
最快完成时间更新为该窗口完成时间
mint_=i //存该窗口下表
end
if flag==1 //要等待
waittime=最快完成时间-到达时间
alltime+=waittime //等待总时间
winnum[mint_]++ //该窗口服务人数
该窗口最快完成时间=最快完成时间+事务处理时间
记录最长等待时间
end
遍历k个窗口
如果该窗口完成时间>最后完成时间
更新最后完成时间直到找到最后完成时间
分别输出平均等待时间、最长等待时间、最后完成时间
遍历k个窗口
输出每个窗口服务人数
2.3 代码截图:
2.4 PTA提交列表说明
部分正确:输出一直错最后一个数据,后来发现求最后完成时间的时候求错了,不该是等待时间加处理时间,而是最快窗口完成时间加处理时间,否则和就变小了,值不对
3.截图本周题目集的PTA最后排名
3.1 栈PTA排名
3.2 队列PTA排名
4. 阅读代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cmath>
using namespace std;
char s[1000];
int i;
double Translation(int & i)
{
double integer = 0.0;
double remainder = 0.0;
while (s[i] >= '0' && s[i] <= '9')
{
integer *= 10;
integer += (s[i] - '0');
i++;
}
if (s[i] == '.')
{
i++;
int c = 1;
while (s[i] >= '0' && s[i] <= '9')
{
double t = s[i] - '0';
t *= pow(0.1, c);
c++;
remainder += t;
i++;
}
}
return integer + remainder;
}
int GetLevel(char ch)
{
switch (ch)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
return 0;
case '#':
return -1;
};
}
double Operate(double a1, char op, double a2)
{
switch (op)
{
case '+':
return a1 + a2;
case '-':
return a1 - a2;
case '*':
return a1 * a2;
case '/':
return a1 / a2;
};
}
double Compute()
{
stack<char> optr;
stack<double> opnd;
optr.push('#');
int len = strlen(s);
bool is_minus = true;
for (i = 0; i < len;)
{
if (s[i] == '-' && is_minus)
{
opnd.push(0);
optr.push('-');
i++;
}
else if (s[i] == ')')
{
is_minus = false;
i++;
while (optr.top() != '(')
{
double a2 = opnd.top();
opnd.pop();
double a1 = opnd.top();
opnd.pop();
char op = optr.top();
optr.pop();
double result = Operate(a1, op, a2);
opnd.push(result);
}
optr.pop();
}
else if (s[i] >= '0' && s[i] <= '9')
{
is_minus = false;
opnd.push(Translation(i));
}
else if (s[i] == '(')
{
is_minus = true;
optr.push(s[i]);
i++;
}
else
{
while (GetLevel(s[i]) <= GetLevel(optr.top()))
{
double a2 = opnd.top();
opnd.pop();
double a1 = opnd.top();
opnd.pop();
char op = optr.top();
optr.pop();
double result = Operate(a1, op, a2);
opnd.push(result);
}
optr.push(s[i]);
i++;
}
}
while (optr.top() != '#')
{
double a2 = opnd.top();
opnd.pop();
double a1 = opnd.top();
opnd.pop();
char op = optr.top();
optr.pop();
double result = Operate(a1, op, a2);
opnd.push(result);
}
return opnd.top();
}
int main()
{
while (cin >> s)
cout << "结果为:" << Compute()<< endl << endl;
}
这段代码的功能是进行四则运算,优点:将部分运算符优先级用数字表示,便于比较字符优先级。
地址:https://gitee.com/adressad/codes/9ystlgoh6b413n5vfupa839