每年,都有很多新同学来到我们学校,最近,我们学校的领导为了考验新同学的能力,想出了一个方法来测试:
领导们定义了一个队列,队列中的元素是顺序存放的,领导们还定义了队列的几种操作:
a) insert x,向队列末尾添加一个元素 x
b) delete,删除队列前的第一个元素
c) MinElement 删除队列中的最小元素
输入格式
首先一个正整数 N,代表操作的数量:
接下来从 2 到 N+1 行:
每行开始一个字符串 s, 有 3 种字符串:insert
,delete
或者 MinElement
- 对于 insert 接下来有个整数 x,代表插入队列的元素
- 对于 delete,删除队首的元素
- 对于 MinElement,返回队列中的最小元素,并且把这个元素从队列中删除
输出格式
对于每个操作,输出不同的答案:
- 对于 insert,输出队列中元素的总数 n
- 对于 delete,删除队首的元素,并且输出这个队首元素 x
- 对于 MinElement,输出队列中的最小元素 x,并且把这个元素从队列中删除
/*switch只能整型表达式*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxx 50000
typedef int Position;
typedef struct QNode *PtrToQNode;
struct QNode
{
int* Data;
Position Front,Rear;
int MaxSize;
};
typedef PtrToQNode Queue;
Queue CreateQueue(int MAx);
void insert(Queue* Q,int n);
void Delete(Queue* Q);
void MinElement(Queue* Q);
int main()
{
int num,a;
Queue Q;
char str[maxx];
scanf("%d",&num);
Q=CreateQueue(num);
for(int i=0;i<num;i++)
{
scanf("%s",str);
if(strcmp(str,"insert")==0)
{scanf("%d",&a);
insert(&Q,a);
}
else if(strcmp(str,"delete")==0)/*这段小心一定要比较函数不能==因为这个==比较的是地址,不可能一样的*/
Delete(&Q);
else if(strcmp(str,"MinElement")==0)
MinElement(&Q);
}
}
Queue CreateQueue(int MAx)
{
Queue Q;
Q=(Queue)malloc(sizeof(struct QNode));
Q->Data=(int*)malloc(MAx*sizeof(int));
Q->Front=Q->Rear=0;
Q->MaxSize=MAx;
return Q;
}
void insert(Queue* Q,int n)
{
(*Q)->Data[((*Q)->Rear)++]=n;
printf("%d\n",((*Q)->Rear)-((*Q)->Front));
}
void Delete(Queue* Q)
{
printf("%d\n",(*Q)->Data[(*Q)->Front]);
(*Q)->Front++;
}
void MinElement(Queue *Q)
{
int min,minnum,j;
minnum=(*Q)->Front;
min=(*Q)->Data[(*Q)->Front];
for( j=(*Q)->Front+1;j<(*Q)->Rear;j++)
{
if((*Q)->Data[j]<min)
{
min=(*Q)->Data[j];
minnum=j;
}
}
printf("%d\n",min);
if(minnum==(*Q)->Front)
(*Q)->Front++;
else
{
for(int p=minnum;p>(*Q)->Front;p--)
(*Q)->Data[p]=(*Q)->Data[p-1];
(*Q)->Front++;
}
}