(20220221)顺序队列

#include<stdio.h>
#include<stdlib.h>

#define SIZE 10

enum ret_val
{
    MALLOC_OK = 100,
    MALLOC_NO,
    CREATE_OK,
    CREATE_NO,
    EMPTY_NO,
    EMPTY_OK,
    FULL_OK,
    FULL_NO,
    POP_OK,
    POP_NO,
    PUSH_OK,
    PUSH_NO,
};

typedef struct quece_node
{
    int data[SIZE];
    int top;
    int buttom;
}Quece;

int is_malloc_ok(Quece *quece)  //判断内存是否成功
{
    if(NULL == quece)
    {
	return MALLOC_NO;
    }
    return MALLOC_OK;
}

int create_quece(Quece **quece)  //创建队列
{
    *quece = (Quece*)malloc(sizeof(Quece));

    if(MALLOC_OK == is_malloc_ok(*quece))
    {
	return CREATE_OK;
    }
    return CREATE_NO;
}
    
void init_quece(Quece *quece)   //初始化队列
{
    quece->top = -1;
    quece->buttom = -1; 
}

int is_empty(Quece *quece)  //是否为空
{
    if(quece->top == quece->buttom)
    {
	printf("quece is NULL!\n");
	return EMPTY_OK;
    }
    return EMPTY_NO;
}

int is_full(Quece *quece)  //是否为满
{
    if((quece->buttom == -1)&&(quece->top == SIZE-1))
    {
	printf("quece is full!\n");
	return FULL_OK;
    } 
   // else if((quece->top - (quece->buttom) + 1) == SIZE + 1)
   // {
//	printf("quece is full!\n");
//	return FULL_OK;
  //  }          //buttom 移动到0处时用的代码,-1处不要
    else
    {
       return FULL_NO;
    }

}

int push_quece(Quece *quece, int num) //进队
{
    int i;
    int j;

    if(FULL_OK == is_full(quece))
    {
	return PUSH_NO;
    }
    
    if(quece->top < SIZE - 1)
    {
	quece->top++;
	quece->data[quece->top] = num;
	return PUSH_OK;
    }
    else
    {
	int tmp = quece->buttom;

	for(i = 0; i <= tmp; i++) //顺序队列往前移动到-1处(buttom)
	{
	    for(j = quece->buttom; j < quece->top; j++)
	    {
                quece->data[j] = quece->data[j + 1];
	    } 
	    quece->buttom--;
	    quece->top--;
	}
	//quece->buttom = -1;
	//quece->top = quece->top -(quece->buttom + 2);

	quece->top++;
	quece->data[quece->top] = num;
	return PUSH_OK;


    }


}
  
int pop_quece(Quece *quece, int *num) //出队
{
    if(EMPTY_OK == is_empty(quece))
    {
	return POP_NO;
    }
    else
    {
	quece->buttom++;
	(*num) = quece->data[quece->buttom];
	return POP_OK;
    }

}

int make_empty(Quece *quece)  //置空
{
    quece->top = quece->buttom = -1;
}

 
int main()
{
    Quece *quece = NULL;
    int i;
    int num;
    
    if(CREATE_NO == create_quece(&quece))  //创建队列
    {
	return 0;
    }

    init_quece(quece);   //初始化队列
    
    printf("****push quece****\n");
    for(i = 0; i < 10; i++)
    {
	num = i + 1;
        if(PUSH_OK == push_quece(quece, num)) //进队
	{
            printf("push quece is success!\n");
	}
	else
	{
            printf("push quece is fail!\n");
	}
    }
    
    printf("****pop quece****\n");
    for(i = 0; i < 5; i++)
    {
        if(POP_OK == pop_quece(quece, &num)) //出队
	{
	    printf("%d\n", num);
	}
	else
	{
	    printf("pop quece is fail!\n");
	}
    }
    
    printf("****push quece****\n");
    for(i = 0; i < 5; i++)
    {
	num = i + 1;
        if(PUSH_OK == push_quece(quece, num)) //进队
	{
            printf("push quece is success!\n");
	}
	else
	{
            printf("push quece is fail!\n");
	}
    }
    
    printf("****pop quece****\n");
    for(i = 0; i < 10; i++)
    {
        if(POP_OK == pop_quece(quece, &num)) //出队
	{
	    printf("%d\n", num);
	}
	else
	{
	    printf("pop quece is fail!\n");
	}
    }


    //make_empty(quece);  //置空

    free(quece);  //释放队列

    return 0;
}

进队函数也可以这样写:

注意:第22行 与 第23行 代码不能调换位置!!!!!

int push_queue(QUEUE *queue, int num) //进队
{
    int i;

    if(FULL_OK == is_full(queue))
    {
        return PUSH_NO;
    }
    else
    {
        if(queue->rear < MAX_SIZE - 1)
        {
            queue->rear++;
            queue->queue[queue->rear] = num;
        }
        else
        {
            for(i = (queue->front + 1); i <= queue->rear; i++)
            {
                queue->queue[i-(queue->front + 1)] = queue->queue[i];
            }
            queue->rear = ((queue->rear)-(queue->front + 1));
            queue->front = -1;

            queue->rear++;
            queue->queue[queue->rear] = num;

        }
        return PUSH_OK;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值