面试题59 - II. 队列的最大值(C语言)

面试题59 - II. 队列的最大值(C语言)

题目:
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1。例:
输入:[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop_front”,“max_value”] ;[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]

思路:
由于时间复杂度限制以及方便处理,运用链表。
法一:添加头节点(注意head和MaxQueue的关系)
法二:双端队列

代码:

typedef struct {
    int val;
    struct MaxQueue *next;
} MaxQueue;

typedef struct {	//MaxQueue类型的队头队尾构成头节点
    MaxQueue *front;
    MaxQueue *rear;
} head;

MaxQueue* maxQueueCreate() {
    head *obj=malloc(sizeof(head));
    obj->front = obj->rear=NULL;
    return obj;
}

int maxQueueMax_value(head* obj) {
    if(obj->front==NULL)   return -1;
    
    MaxQueue *p=obj->front;
    int max=p->val;
    while(p){
        if(p->val>max)  max=p->val;
        p=p->next;
    }
    return max;
}

void maxQueuePush_back(head* obj, int value) {
    MaxQueue *new=malloc(sizeof(MaxQueue));	//给新插入的值赋予队列类型
    new->val=value;
    new->next=NULL;
    
    if(obj->front==NULL){
        obj->front=new;
        obj->rear=new;
    }
    else{
        obj->rear->next=new;
        obj->rear=new;
    }
}

int maxQueuePop_front(head* obj) {
    if(obj->front==NULL)   return -1;
    
    MaxQueue *del=obj->front;
    int tmp=del->val;

    obj->front=del->next;
    del->next=NULL;
    free(del);
    
    return tmp;
}

void maxQueueFree(MaxQueue* obj) {
    MaxQueue *del=obj;	//一个个free
    while(del){
        obj=obj->next;
        del->next=NULL;
        free(del);
        del=obj;
    }
}

/**
 * Your MaxQueue struct will be instantiated and called as such:
 * MaxQueue* obj = maxQueueCreate();
 * int param_1 = maxQueueMax_value(obj);
 * maxQueuePush_back(obj, value);
 * int param_3 = maxQueuePop_front(obj);
 * maxQueueFree(obj);
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值