#include <stdlib.h>
#include <memory.h>
#include "queue.h"
#ifdef __cplusplus
extern "C"{
#endif
#ifdef QUEUE_LINK
typedef struct queue{
int num;
struct queue *next;
}QUEUE;
QUEUE *g_queue = NULL;
QUEUE *g_lastOne = NULL;
int enqueue(int i)
{
QUEUE *tempAdd = (QUEUE*)malloc(sizeof(QUEUE));
if(tempAdd == NULL)
{
return -1;
}
memset(tempAdd,0,sizeof(QUEUE));
tempAdd->num = i;
if(g_queue == NULL)
{
g_queue = tempAdd;
g_lastOne = g_queue;
}
else
{
g_lastOne->next = tempAdd;
g_lastOne = g_lastOne->next;
}
return 0;
}
int dequeue(int *i)
{
QUEUE *tempde = NULL;
if(i == NULL)
{
return -1;
}
if(g_queue == NULL)
{
return -1;
}
*i = g_queue->num;
tempde = g_queue;
g_queue = g_queue->next;
free(tempde);
return 0;
}
int queue_empty()
{
return (g_queue == NULL)?1:0;
}
#endif
#ifdef QUEUE_ARRAY
/* 使用哨兵 */
/* head指向应该插入的位置,若队列满则指向哨兵 */
/* end指向队列尾,若队列空则指向head*/
int g_queue[MAX_QUEUE + 1] = {0};
unsigned int g_queueHead = 1;
unsigned int g_guard = 0;
unsigned int g_queueEnd = 1;
int enqueue(int i)
{
if(queue_full())
{
return -1;
}
g_queue[g_queueHead++] = i;
if(g_queueHead == MAX_QUEUE + 1)
{
g_queueHead = 0;
}
if(g_queueEnd == g_guard)
{
++g_queueEnd;
}
return 0;
}
int dequeue(int *i)
{
if(i == NULL)
{
return -1;
}
if(queue_empty())
{
return -1;
}
*i = g_queue[g_queueEnd++];
if(g_queueEnd == MAX_QUEUE + 1)
{
g_queueEnd = 0;
}
++g_guard;
if(g_guard == MAX_QUEUE + 1)
{
g_guard = 0;
}
return 0;
}
int queue_full()
{
return (g_queueHead == g_guard);
}
int queue_empty()
{
return (g_queueEnd == g_queueHead);
}
#endif
#ifdef __cplusplus
}
#endif