其实链表还是用动态的做才正宗...偷懒了..用静态的了..就是好多细节要注意..比如啥时候算是空栈...当前插入的client若在队头或者队尾..反正我就是一堆if else~~
Program:
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
struct node
{
int den,pri,pre,next;
}s[100000];
int head,last,p,num,i;
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
num=head=last=0;
s[0].pre=s[0].next=0;
while (~scanf("%d",&p))
{
if (!p) break;
if (!last) head=0;
if (!head) last=0;
if (p==2)
{
if (!last) printf("0\n");
else
{
printf("%d\n",s[last].den);
last=s[last].pre;
s[last].next=0;
}
}else
if (p==3)
{
if (!head) printf("0\n");
else
{
printf("%d\n",s[head].den);
head=s[head].next;
s[head].pre=0;
}
}else
{
num++;
scanf("%d%d",&s[num].den,&s[num].pri);
if (head && s[num].pri<s[head].pri)
{
s[head].pre=num;
s[num].next=head;
head=num;
s[head].pre=0;
}
else
if (last && s[num].pri>s[last].pri)
{
s[last].next=num;
s[num].pre=last;
last=num;
s[last].next=0;
}else
if (!head)
{
head=last=num;
s[num].pre=s[num].next=0;
}else
{
i=head;
while (i && s[i].pri<s[num].pri) i=s[i].next;
s[num].pre=s[i].pre; s[num].next=i;
s[s[i].pre].next=num; s[i].pre=num;
}
}
}
return 0;
}