面试题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);
*/