优先队列的pop与push

前言

个人小记


一、代码

#include<stdio.h>
#include <stdlib.h>
#define MAX_LEN 10
#define father(n) ((n)/2)
#define left(n)   (2*(n))
#define right(n)  (2*(n)+1)
typedef struct Prequeue
{
    int * __data,*data;
    int size,count;
}Prequeue;

Prequeue* init_PreQueue(int size)
{
    Prequeue* PQ=(Prequeue*)malloc(sizeof(Prequeue));
    PQ->size=size;
    PQ->count=0;
    PQ->__data=(int *)malloc(sizeof(int)*size);
    PQ->data=PQ->__data-1;
    return PQ;
}

int isempty(Prequeue* PQ)
{
    return PQ->count==0;
}

int isfull(Prequeue*PQ)
{
    return PQ->size==PQ->count;
}

int search(Prequeue* PQ)
{
    return PQ->data[1];
}

void swap(int *a,int *b)
{
    int t=*a;
    *a=*b;
    *b=t;
    return ;
}

void up_update(Prequeue* PQ,int pos)
{
    while(pos>1&&PQ->data[pos]>PQ->data[father(pos)])
    {    
        swap(&(PQ->data[pos]),&PQ->data[father(pos)]);
        pos=father(pos);
    }
    return ;
}

void push(Prequeue* PQ,int val)
{
    if(isfull(PQ))
    {
        printf("队列已满无法push\n");
        return ;
    }
    PQ->count+=1;
    PQ->data[PQ->count]=val;
    up_update(PQ,PQ->count);
    return ;
}

void down_update(Prequeue* PQ,int pos,int n)
{
    while(left(pos)<=n)
    {
        int max=pos;
        if(PQ->data[max]<PQ->data[left(pos)])max=left(pos);
        if(right(pos)<=n&&PQ->data[max]<PQ->data[right(pos)])max=right(pos);
        if(pos==max)return ;
        else
        {
            swap(&(PQ->data[max]),&(PQ->data[pos]));
            pos=max;
        }
    }
    return ;
}

void pop(Prequeue* PQ)
{
    if(isempty(PQ))
    {
        printf("队列为空无法pop\n");
        return ;
    }
    PQ->data[1]=PQ->data[PQ->count];
    PQ->count-=1;
    down_update(PQ,1,PQ->count);
    return ;
}

void clear(Prequeue* PQ)
{
    if(PQ==NULL)return ;
    free(PQ->data);
    free(PQ);
    return ;
}

void output(Prequeue* PQ)
{
    printf("优先队列为:");
    for(int i=1;i<=PQ->count;i++)
    {
        printf("%d ",PQ->data[i]);
    }
    printf("\n");
    return ;
}

int main()
{
    Prequeue* PQ=init_PreQueue(MAX_LEN);
    int t,val;
    printf("请输入0(代表pop)或者1(代表push):");
    while(scanf("%d",&t)!=EOF)
    {
        if(t==1)
        {
            printf("请输入push的数值:");
            scanf("%d",&val);
            push(PQ,val);
            output(PQ);
        }
        if(t==0)
        {
            printf("pop:%d\n",search(PQ));
            pop(PQ);
            output(PQ);
        } 
        printf("请输入0(代表pop)或者1(代表push):");
    }
    clear(PQ);
    return 0;
}

二、测试结果

sjq@SEER:~/coding$ ./a.out 
请输入0(代表pop)或者1(代表push):1
请输入push的数值:11
优先队列为:11 
请输入0(代表pop)或者1(代表push):1
请输入push的数值:12
优先队列为:12 11 
请输入0(代表pop)或者1(代表push):1
请输入push的数值:13
优先队列为:13 11 12 
请输入0(代表pop)或者1(代表push):1
请输入push的数值:14
优先队列为:14 13 12 11 
请输入0(代表pop)或者1(代表push):1
请输入push的数值:1
优先队列为:14 13 12 11 1 
请输入0(代表pop)或者1(代表push):1
请输入push的数值:1
优先队列为:14 13 12 11 1 1 
请输入0(代表pop)或者1(代表push):1
请输入push的数值:2
优先队列为:14 13 12 11 1 1 2 
请输入0(代表pop)或者1(代表push):1
请输入push的数值:3
优先队列为:14 13 12 11 1 1 2 3 
请输入0(代表pop)或者1(代表push):1
请输入push的数值:4
优先队列为:14 13 12 11 1 1 2 3 4 
请输入0(代表pop)或者1(代表push):1
请输入push的数值:5
优先队列为:14 13 12 11 5 1 2 3 4 1 
请输入0(代表pop)或者1(代表push):1
请输入push的数值:6
队列已满无法push
优先队列为:14 13 12 11 5 1 2 3 4 1 
请输入0(代表pop)或者1(代表push):0
pop:14
优先队列为:13 11 12 4 5 1 2 3 1 
请输入0(代表pop)或者1(代表push):0
pop:13
优先队列为:12 11 2 4 5 1 1 3 
请输入0(代表pop)或者1(代表push):0
pop:12
优先队列为:11 5 2 4 3 1 1 
请输入0(代表pop)或者1(代表push):0
pop:11
优先队列为:5 4 2 1 3 1 
请输入0(代表pop)或者1(代表push):0
pop:5
优先队列为:4 3 2 1 1 
请输入0(代表pop)或者1(代表push):0
pop:4
优先队列为:3 1 2 1 
请输入0(代表pop)或者1(代表push):0
pop:3
优先队列为:2 1 1 
请输入0(代表pop)或者1(代表push):0
pop:2
优先队列为:1 1 
请输入0(代表pop)或者1(代表push):0
pop:1
优先队列为:1 
请输入0(代表pop)或者1(代表push):0
pop:1
优先队列为:
请输入0(代表pop)或者1(代表push):0
pop:1
队列为空无法pop
优先队列为:
请输入0(代表pop)或者1(代表push):^C
sjq@SEER:~/coding$ 
  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值