打印机任务队列问题

PleaseLieToMe 2016-05-15 10:10:09
数据结构关于打印机队列问题
打印机的打印队列中,每一个打印任务都有一个优先级,为1~9的一个整数(9的优先级最高,1的优先级最低),打印按如下方法进行.
(1)取出打印队列中队首的打印任务J;
(2)如果打印队列中存在优先级高于J的打印任务,则将J移动到打印队列的队尾;否则,打印J.
现在的问题是,要确定你要打印的文件何时打印完毕。给定当前打印队列(一个优先级队列)和你的打印任务在当前打印队列中的位置,确定你的打印任务完成时需要多长时间。为了简化问题,假定没有新的打印任务加入到打印队列中;并且,假定完成任何一个打印任务均需要1min时间,向打印队列中加入一个打印任务或从打印队列中移除一个打印任务不需要时间。
例如,当前打印队列为“1
1 9 1 1 1”且你的打印任务在队首时,需要5min.

(在网上找的这个算法都是用冒泡排序,如果是冒泡的话 像题目中的例子的第一个1就会跑到第二个去 而不是最后一个 题目要求:如果打印队列中存在优先级高于J的打印任务,则将J移动到打印队列的队尾;否则,打印J.)
#include <stdlib.h>
#include <iostream>
//#include "SeqCircularQueue.h"
#include "Queue.h"
using namespace std;

#define TASKS_NUM 5


int A[TASKS_NUM];
int temp[TASKS_NUM];
Queue *pQue;

int b,i,j,k,n;
elementType J;
int P; // 输入优先级

void bubble_sort(){ //冒泡排序
int tp;
int tag;

for(i=0;i<TASKS_NUM;i++)
for(j=0;j<TASKS_NUM;j++)
if(temp[j] <temp[i])
{
tp = temp[j];
temp[j] = temp[i];
temp[i] = tp;
}


/* for(j=0;j<TASKS_NUM;j++){
if(temp[j]>tag){
for(i=0;i<TASKS_NUM;i++){
temp[i]=temp[i+1];
temp[TASKS_NUM-1]=tag;
}
}
}
*/
}

void main()
{
pQue = new Queue();

// 生成打印任务及其对应优先级
cout<<"请输入"<< TASKS_NUM <<"个打印任务和其对应优先级"<<endl;
for(i=0;i<TASKS_NUM;i++){ //构造打印序列J
cout << "第"<< i+1<<"个打印内容" << endl;
cin >> J;

cout << "第"<< i+1 << "个任务优先级:" << endl;
cin>>P;
pQue->appendPrintData(J, P);
}

// 查看打印数据和对应优先级
for(i = 1; i<= TASKS_NUM; i++)
{
cout << "数据:" << pQue->data[i].printData << "优先级:" << pQue->data[i].priority << endl;
}

cout << "输入第几个要打印的任务" << endl;

cin >> k;

b = pQue->data[k].priority; //将K位置对应的打印优先级存入b中

cout << "待打印任务的优先级: " << b << endl;

for(i=0;i<TASKS_NUM;i++){ //将队列的DATA数组的优先级存入到临时数组temp[]中
temp[i]=pQue->data[i+1].priority;
}

for(i = 0; i< TASKS_NUM; i++)
{
cout << "排序前优先级:" << temp[i] << endl;
}

bubble_sort(); //对临时数组进行冒泡排序,从大到小

cout << endl;
for(i = 0; i< TASKS_NUM; i++)
{
cout << "排序后优先级:" << temp[i] << endl;
}

i = 0;
while(temp[i]!=b) //将temp数组中等于b的下标给i
i++;

cout<< "打印位置"<< k <<"所需要的时间"<< i+1+1<<"分钟"<<endl; //i为打印位置K所需要的时间
}
...全文
1635 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2016-05-15
  • 打赏
  • 举报
回复
优先级队列?似乎可以用二叉树做
PleaseLieToMe 2016-05-15
  • 打赏
  • 举报
回复
引用 2 楼 zxh707wk 的回复:
http://zhidao.baidu.com/link?url=rmD-ZPJ-cUpO2w0g91fEdA8zBMDeCcZ0UwPNZNgKAW_XGPBeNbVGsVmvoGjn4SYI5DsG8C9p_ibvEhAzFj8wyFrSa87wqzqNY09c-xdywKG
2楼的发的那个我看过了 那个排序是冒泡排序 不是我要的 我是 比如优先级 题目要求:如果打印队列中存在优先级高于J的打印任务,则将J移动到打印队列的队尾;否则,打印J. 比如5 3 1 7 9 最后会变成 9 5 3 1 7 这样 排序我已经实现了, 但是最后在确认我要打印文件的位置的时候 如果数组中存在优先级相同的元素就会错了 比如 1 9 1 1 1 排完后是 9 1 1 1 1 这时候我要打印 第一个1 那么排完后就会移动到最后一个, 而最后在检索的时候只会匹配到数组中出现的第一个1 即第二个 实际我要找到第五个1 不知道怎么实现。。
PleaseLieToMe 2016-05-15
  • 打赏
  • 举报
回复
2楼的发的那个我看过了 那个排序是冒泡排序 不是我要的 我是 比如优先级 题目要求:如果打印队列中存在优先级高于J的打印任务,则将J移动到打印队列的队尾;否则,打印J. 比如5 3 1 7 9 最后会变成 9 5 3 1 7 这样 排序我已经实现了, 但是最后在确认我要打印文件的位置的时候 如果数组中存在优先级相同的元素就会错了 比如 1 9 1 1 1 排完后是 9 1 1 1 1 这时候我要打印 第一个1 那么排完后就会移动到最后一个, 而最后在检索的时候只会匹配到数组中出现的第一个1 即第二个 实际我要找到第五个1 不知道怎么实现。。
707wk 2016-05-15
  • 打赏
  • 举报
回复
http://zhidao.baidu.com/link?url=rmD-ZPJ-cUpO2w0g91fEdA8zBMDeCcZ0UwPNZNgKAW_XGPBeNbVGsVmvoGjn4SYI5DsG8C9p_ibvEhAzFj8wyFrSa87wqzqNY09c-xdywKG
PleaseLieToMe 2016-05-15
  • 打赏
  • 举报
回复
这里的排序该怎么写?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧