2149. 华丽的队列 华师oj

每年,都有很多新同学来到我们学校,最近,我们学校的领导为了考验新同学的能力,想出了一个方法来测试:

领导们定义了一个队列,队列中的元素是顺序存放的,领导们还定义了队列的几种操作:

a) insert x,向队列末尾添加一个元素 x

b) delete,删除队列前的第一个元素

c) MinElement 删除队列中的最小元素

输入格式

首先一个正整数 N,代表操作的数量:

接下来从 2 到 N+1 行:

每行开始一个字符串 s, 有 3 种字符串:insertdelete 或者 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++;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值