POJ3125--Printer_Queue

题目链接:http://poj.org/problem?id=3125

     题目大家读一下意思很容易理解,在此就不赘述。本题主要就是考察单链表/队列的简单操作。


算法设计:

1.根据输入创建队列CreateList()函数,然后用addNode()函数向队列上增加结点,那么得到队列;
结点定义为:
typedef struct LNode
{
    int priority;
    int pos;
    struct LNode *next;
}LNode;
2.取队头元素遍历整个队列:
2.1.如果队头元素不是优先级最大的(调用 firstIsMaxPrior()函数),那么插入队尾,然后继续取队头元素进行遍历;
2.2.否则出队,相应的总时间time加1,然后比较出队元素的位置是否和所求位置一致:
    2.2.1.如果一致,那么输出time,释放所有空间(调用destroyQueue()函数)
    2.2.2.如果不一致,那么将其出队,继续取队头元素进行遍历整个队列

代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;

typedef struct LNode
{
	int prior;    //结点的优先级 
	int pos;      //结点所在的位置 
	struct LNode *next;
}tLNode;

tLNode *head , *tail;    //定义队头和队尾指针 
int Time;

void 
createQueue()    //初始化头结点和和尾指针 
{
	head = new tLNode();
	tail = new tLNode();
	head->next = NULL;
	tail->next = NULL;
}

void 
addNode(int priority,int position)    //向队列中增加结点 
{
	tLNode *s = new tLNode();    //创建结点s,并对其成员变量赋值 
	s->prior = priority;
	s->pos = position;
	tLNode *p = head;
	while(p->next!=NULL)    //找到队尾指针 
		p=p->next;
	p->next = s;    //将结点s插入队尾,并将队尾指针tail指向队尾结点 
	s->next = NULL;
	tail = s;
}

void 
destroyQueue()
{
	tLNode *p = head;
	while(p->next!=NULL)
	{
		tLNode *q=p;
		p = p->next;
		delete(q);
	}
	delete(p);
}

bool firstIsMaxPrior()     //判断队首元素是不是优先级最大的 
{
	tLNode *first = head->next;
	tLNode *p = first;
	while(p->next!=NULL)
	{
		p = p->next;
		if(p->prior > first->prior)  return false;
	}
	return true;
}

void 
solve(int position)
{
	while(1)
	{
		if( firstIsMaxPrior() )   //如果优先级最大 
		{
			Time++;
			if(head->next->pos == position )   //且正是所要求的结点 
			{
				cout<<Time<<endl;
				destroyQueue();
				break;
			}
			else    //如果不是,将队首结点出队 
			{
				tLNode *first = head->next;
				head->next = first->next;
				delete(first);
			}
		}
		else     //如果优先级不是最大的,那么把队首结点取出插入到队尾 
		{
			tLNode *first = head->next;
			head->next = first->next;
			first->next = NULL;
			tail->next = first;
			tail = first;
		}
	}
	return ;
}

/*
void 
display()    //用于调试打印 
{
	tLNode *p = head;
	while(p->next!=NULL)
	{
		p = p->next;
		cout<<p->prior<<" "<<p->pos<<endl;
	}
}
*/

int main()
{
	int num , n , pos, priority;
	cin>>num;
	for(int i=0;i<num;i++)
	{
		cin>>n>>pos;
		createQueue();
		Time = 0;
		for(int j=0;j<n;j++)
		{
			cin>>priority;
			addNode(priority,j);
		}
		solve(pos);
	//	display();
	}
    return 0;
}

Run ID User Problem Result Memory Time Language Code Length Submit Time
12071794 niuliguo 3125 Accepted 728K 63MS G++ 1798B 2013-09-04 09:34:38




你可能感兴趣的:(算法,队列,单链表,poj)