打印机任务队列问题
数据结构关于打印机队列问题
打印机的打印队列中,每一个打印任务都有一个优先级,为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所需要的时间
}