数据结构课程设计题目十二_计算机学院学生会的打印机(优先队列)

本文出自:http://blog.csdn.net/svitter

题目12:计算机学院学生会的打印机(优先队列)

小明抱怨学生会的打印机不符合FIFO的原则,看到许多在他后面来打印的同学比他先打印出来。五分钟前,小明的文件就是下一个候选的,现在小明的文件又排到了后面。学生会的同学给小明解释说,学生会的打印机不是采用传统的队列方式,而是采用一种自己定义的优先队列方式:每个要打印的文件被赋予了一个从19的优先级(9最高,1最低)。打印规定如下:

将队列中要打印的文件f从队列中拿出来;

如果在队列中有优先级高于f的文件,则不打印f,将f排到队列的最后;否则打印f

小明知道打印新规以后,询问他的文件究竟多长时间能够打印出来,假设没分文件打印的时间都是1分钟,小明的文件在打印队列中,并且不再有新的文件进入到打印队列。请你帮助小明计算一下他还需要等多长时间。建议完成人数1人。


添加了小元素的筛选代码


PriorityQueue.cpp:

//============================================================================
// Name        : PriorityQueue.cpp
// Author      : vit
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <stdio.h>
#include "Queue.h"
using namespace std;

int main() {
	Queue *q;
	q = new Queue();
	int i;
	int n, m, val, num;
        int mval;
	Node *p;
	freopen("test", "r", stdin);
	while(~scanf("%d%d", &n, &m))
	{
		num = 1;
		for(i = 1; i <= n; i++)
		{
			scanf("%d", &val);
			//printf("第%d号正在加入队列...\n", i);
			p = new Node(val, NULL, i);
                        if(i == m)
                        {
                               mval = val;
                        }
			q->push(p);
		}
                q->check(mval);


		//printf("队列加入完成。\n");
		while(!q->IsEmpty())
		{
			p = q->top();
			//printf("当前打印的是第%d号\n", p->num);
			if(p->num == m)
			{
				printf("小明在第%d分钟打印。\n", num);
			}
			q->pop();
			num++;
		}
	}
	return 0;
}


Queue.cpp:

/*
 * Queue.cpp
 *
 *  Created on: 2014Äê6ÔÂ15ÈÕ
 *      Author: vit
 */

#include <stdio.h>
#include "Queue.h"

Queue::Queue() {
	// TODO Auto-generated constructor stub
	this->front = this->rear = NULL;
}

bool Queue::IsEmpty(){
	return this->rear == NULL;
}

void Queue::push(Node *n){
	if(IsEmpty())
	{
		this->front = this->rear = n;
	}
	else
	{
		this->rear->next = n;
		this->rear = n;
	}
	return;
}

void Queue::pop(){
	if(IsEmpty())
	{
		return;
	}
	Node *p = this->front;
	if(this->front == this->rear)
	{
		p = this->front;
		this->front = this->rear = NULL;
	}
	else
	{
		p = this->front;
		this->front = this->front->next;
	}
	delete p;
}

Node * Queue::top(){
	if(IsEmpty()){
		return NULL;
	}
	int value = this->front->value;
	Node *p = this->front;
	while(p->next != NULL)
	{
		if(p->next->value <= value)
			p = p->next;
		else
		{
			this->rear->next = this->front;
			this->rear = p;
			this->front = p->next;
			p->next = NULL;
			p = this->front;
			value = p->value;
		}
	}
	return this->front;
}

void Queue::check(int mval)
{
    Node *p = this->front;
    Node *temp;
    while(p->next != NULL)
    {
        if(p->next->value < mval)
        {
            temp = p->next;
            p->next = p->next->next;
            delete temp;
        }
        //p指向下一个节点
        p = p->next;
    }
}


Queue::~Queue() {
	// TODO Auto-generated destructor stub
	while(!IsEmpty())
	{
		Node *temp;
		temp = this->front;
		this->front= this->front->next;
		delete temp;
	}
}



Queue.h:

/*
 * Queue.h
 *
 *  Created on: 2014年6月15日
 *      Author: vit
 */

#ifndef QUEUE_H_
#define QUEUE_H_


class Node
{
public:
    int value;
    int num;
    Node *next;
    Node()
    {
        this->value = 0;
        this->num = 0;
        this->next = 0;
    }
    Node(int value, Node *next, int num)
    {
        this->value = value;
        this->next = next;
        this->num = num;
    }
};

class Queue
{
public:
    Queue();
    virtual ~Queue();

    //method
    void push(Node *n);
    void pop();
    Node* top();
    bool IsEmpty();
    void check(int mval);

    //member
    Node *front;
    Node *rear;
};
#endif /* QUEUE_H_ */


你可能感兴趣的:(数据结构)