#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;
}
}