文章目录
A. DS队列+堆栈–数制转换
题目描述
对于任意十进制数转换为k进制,包括整数部分和小数部分转换。整数部分采用除k求余法,小数部分采用乘k取整法例如x=19.125,求2进制转换
整数部分19, 小数部分0.125
19 / 2 = 9 … 1 0.125 * 2 = 0.25 … 0
9 / 2 = 4 … 1 0.25 * 2 = 0.5 … 0
4 / 2 = 2 … 0 0.5 * 2 = 1 … 1
2 / 2 = 1 … 0
1 / 2 = 0 … 1
所以整数部分转为 10011,小数部分转为0.001,合起来为10011.001
提示整数部分可用堆栈,小数部分可用队列实现
注意:必须按照上述方法来实现数制转换,其他方法0分
输入
第一行输入一个t,表示下面将有t组测试数据。
接下来每行包含两个参数n和k,n表示要转换的数值,可能是非整数;k表示要转换的数制,1<k<=16
输出
对于每一组测试数据,每行输出转换后的结果,结果精度到小数点后3位
输出小数点后几位的代码如下:
#include
#include
using namespace std;
int main()
{
double r = 123.56789;
cout<<fixed<<setprecision(4)<<r<<endl; //输出小数点后4
return 0;
}
输入样例1
2
19.125 2
15.125 16
输出样例1
10011.001
F.200
代码
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <stack>
#include <queue>
using namespace std;
void prin(int a) {
if(a==10) cout<<'A';
else if(a==11) cout<<'B';
else if(a==12) cout<<'C';
else if(a==13) cout<<'D';
else if(a==14) cout<<'E';
else if(a==15) cout<<'F';
}
int main() {
stack <int> s;
queue <int> q;
int t;
cin>>t;
while(t--) {
int k,m;
double n;
cin>>n>>k;
m=n;
n-=m;
while(m) {
s.push(m%k);
m/=k;
}
while(n) {
q.push(int(n*k));
n=n*k-int(n*k);
}
while(!s.empty()) {
if(s.top()>=0&&s.top()<10)
cout<<s.top();
else prin(s.top());
s.pop();
}
int i=0;
cout<<'.';
while(!q.empty()) {
if(i==3) break;
cout<<q.front();
q.pop();
i++;
}
for(;i<3;i++)
cout<<'0';
cout<<endl;
}
}
B. DS队列之银行排队
题目描述
在银行营业大厅共服务3种客户,类型为A\B\C,大厅分别设置了3个窗口分别服务三种客户,即每个窗口只服务一种客户。现有一批客户来银行办理业务,每个客户都有类型和办理业务时间。每个窗口按照客户到来的顺序进行服务。
编程实现它们的办理流程,请使用C++自带的queue必须使用队列实现,其他方法0分!
队列queue的用法如下:
1.包含头文件:#include
2.定义一个整数队列对象:queue myQe;
3.定义一个整数队列对象数组:queue myQA[10];
4.入队操作:myQe.push(itemp); //把整数itemp进入队列
5.出队操作:myQe.pop(); //把队头元素弹出队列,注意本操作不获取队头元素
6.获取队头元素: itemp = myQe.front(); // 把队头元素放入itemp中,注意本操作不弹出元素
7.判断队列是否为空:myQe.empty();//队列空则返回true,不空则返回false
输入
第一行输入先输入n表示客户数量
第二行输入每个客户的类型,数据之间用用空格隔开
第三行输入每个客户的办理时间,数据之间用用空格隔开
输出
第一行输出A类客户的平均办理时间
第二行输出B类客户的平均办理时间
第三行输出C类客户的平均办理时间
输入样例1
8
A B C B C A A A
10 20 30 40 50 60 70 80
输出样例1
55
30
40
代码
#include<queue>
#include <iostream>
#include <iomanip>
#include<stdlib.h>
using namespace std;
int main() {
queue<int> myQe;
queue <int>myQA[10];
int n,i;
cin>>n;
int *a=new int [n];
char *b=new char[n];
int c[3]= {0};
for(i=0; i<n; i++)
cin>>b[i];
for(i=0; i<n; i++)
cin>>a[i];
for(i=0; i<n; i++) {
if(b[i]=='A') {
myQA[0].push(a[i]);
c[0]++;
}
if(b[i]=='B') {
myQA[1].push(a[i]);
c[1]++;
}
if(b[i]=='C') {
myQA[2].push(a[i]);
c[2]++;
}
}
int M=0;
for(i=0; i<3; i++) {
M=0;
while(!myQA[i].empty()) {
M+=myQA[i].front();
myQA[i].pop();
}
myQe.push(M/c[i]);
}
while(!myQe.empty()) {
cout<<myQe.front()<<endl;
myQe.pop();
}
}
C. DS队列–组队列
题目描述
组队列是队列结构中一种常见的队列结构,在很多地方有着广泛应用。组队列是是指队列内的元素分组聚集在一起。组队列包含两种命令:
1、 ENQUEUE,表示当有新的元素进入队列,首先会检索是否有同一组的元素已经存在,如果有,则新元素排在同组的最后,如果没有则插入队列末尾。
2、 DEQUEUE,表示队列头元素出队
3、 STOP,停止操作
建议使用C++自带的队列对象queue,编程更方便
输入
第1行输入一个t(t<=10),表示1个队列中有多少个组
第2行输入一个第1组的元素个数和数值
第3行输入一个第2组的元素个数和数值
以此类推输入完t组以定义同组元素之后,开始输入多个操作命令(<200),对空的组队列进行操作,例如输入ENQUEUE 100,表示把元素100插入队列
输出
DEQUEUE出队的元素
输入样例1
2
3 101 102 103
3 201 202 203
ENQUEUE 101
ENQUEUE 201
ENQUEUE 102
ENQUEUE 202
ENQUEUE 103
ENQUEUE 203
DEQUEUE
DEQUEUE
DEQUEUE
STOP
输出样例1
101 102 103
代码
#include <iostream>
#include <queue>
int data[200][200],num[200];
int *group;
using namespace std;
int tag[200] = {0};
int WhichGroup(int a, int t) {
int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < group[i]; j++) {
if (a == data[i][j])
return i;
}
}
}
int JudNew(int a, int &t, int tag[200]) {
int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < group[i]; j++)
if (a == data[i][j]) {
if(!tag[i]) return 1;
}
}
return 0;
}
int main() {
queue<int> *q;
queue<int> p;
int i = 0, j, t, n;
cin >> t;
n = t;
q = new queue<int>[t];
group = new int[t];
while (n--) {
cin >> group[i];
for (j = 0; j < group[i]; j++)
cin >> data[i][j];
i++;
}
string str;
int k;
cin >> str;
i = 0, j = 1, k = 0;
while (str != "STOP") {
if (str == "ENQUEUE") {
cin >> num[i];
if (q[0].empty()) {
q[0].push(num[i]);
int temp= WhichGroup(num[i],t);
tag[temp] = 1;
} else if (JudNew(num[i], t,tag)) {
q[j].push(num[i]);
int temp= WhichGroup(num[i],t);
tag[temp] = 1;
j++;
} else {
int c = WhichGroup(num[i], t);
for(int b=j-1;b>=0;b--){
if(WhichGroup(q[b].front(),t)==c){
q[b].push(num[i]);
break;
}
}
}
} else {
while (1) {
if (!q[k].empty()) {
int c = q[k].front();
p.push(c);
q[k].pop();
break;
} else k++;
}
}
cin >> str;
i++;
}
while (!p.empty()) {
j = p.size();
for (i = 0; i < j; i++) {
if (i < j - 1) {
cout << p.front() << ' ';
p.pop();
} else {
cout << p.front() << endl;
p.pop();
}
}
}
}
D. DS队列----银行单队列多窗口模拟
题目描述
假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间。
输入
输入第1行给出正整数N(≤1000),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10),为开设的营业窗口数。
输出
在一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。
输入样例1
9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3
输出样例1
6.2 17 62
代码:
#include <queue>
#include <iostream>
#include <iomanip>
using namespace std;
class costomer {
public:
int arrival, duetime;
};
int finishtime[1000] = {0};
int tag[1000] = {1};
int main() {
queue<costomer> q;
int N, i, num;
cin >> N;
int ari, due;
for (i = 0; i < N; i++) {
cin >> ari >> due;
q.push({ari, due});
}
cin >> num;
int clock = 0, maxwait = 0, final = 0, allwait = 0, wait = 0;
while (!q.empty()) {
if (clock >= q.front().arrival) {
for (i = 0; i < num; i++) {
if (finishtime[i] <= clock)
tag[i]=1;
}
for(i=0;i<num;i++){
if(tag[i]&&!q.empty()&&clock>=q.front().arrival){
tag[i]=0;
finishtime[i]=clock+q.front().duetime;
wait=clock-q.front().arrival;
if(wait>=maxwait) maxwait=wait;
allwait+=wait;
if(finishtime[i]>final) final=finishtime[i];
q.pop();
}
}
}
clock++;
}
cout<<fixed<<setprecision(1)<<allwait*1.0/N<<' '<<maxwait<<' '<<final;
}
E. DS栈+队列—排队游戏
题目描述
在幼儿园中,老师安排小朋友做一个排队的游戏。首先老师精心的把数目相同的小男孩和小女孩编排在一个队列中,每个小孩按其在队列中的位置发给一个编号(编号从0开始)。然后老师告诉小朋友们,站在前边的小男孩可以和他后边相邻的小女孩手拉手离开队列,剩余的小朋友重新站拢,再按前后相邻的小男孩小女孩手拉手离开队列游戏,如此往复。由于教师精心的安排,恰好可以保证每两个小朋友都能手拉手离开队列,并且最后离开的两个小朋友是编号最小的和最大的两个小朋友。(注:只有小男孩在前,小女孩在后,且他们两之间没有其他的小朋友,他们才能手拉手离开队列)。请根据老师的排队,按小女孩编号从小到大的顺序,给出所有手拉手离开队列的小男孩和小女孩的编号对。
输入
用一个字符串代表小朋友队列。字符串中只会出现两个字符,分别代表小男孩和小女孩,首先出现的字符代表小男孩,另一个字符代表小女孩。小孩总数不超过100。
输出
按小女孩编号顺序,顺序输出手拉手离开队列的小男孩和小女孩的编号对,每行一对编号,编号之间用一个空格分隔。
输入样例1
((()(())())(()))
输出样例1
2 3
5 6
4 7
8 9
1 10
12 13
11 14
0 15
代码
#include <queue>
#include<stack>
#include <string>
#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
class pot {
public:
char a;
int data;
};
int main() {
queue<int> Q;
stack<pot> S;
string str;
cin>>str;
int i;
char a[2];
a[0]=str[0];
for(i=1;i<str.length();i++){
if(str[i]!=str[0]) {
a[1]=str[i];
break;
}
}
for(i=0; i<str.length(); i++) {
// Q.push({str[i],i});
if(str[i]==a[0]) S.push({a[0],i});
else {
cout<<S.top().data<<' '<<i<<endl;
S.pop();
}
}
}