循环队列
循环队列在我们传递数据的过程中经常会用到,相对于直线队列来讲,直线队列在元素出队后,头指针向后移动,导致删除元素后的空间无法在利用,当变成循环队列之后,删除元素后的空间仍然可以利用。
- 声明一块RAM空间
#define MAX_SIZE 20
static ev_queue[MAX_SIZE] = { 0 };
static int ev_front = -1;
static int ev_rear = -1;
static int ev_size = 0;
-判断队列是否为满
boolean is_ev_queue_full( void )
{
return MAX_SIZE == ev_size;
}
-判断队列是否为空
boolean is_ev_queue_empty( void )
{
return 0 == ev_size;
}
-向队列添加元素
boolean add_event ( event ev )
{
// If queue is full return FALSE
if( is_ev_queue_full() )
{
return FALSE;
}
else
{
// next node index
++ev_rear;//由于初始值为-1,这里变为0
ev_rear %= MAX_SIZE;//下标超出最大范围之后重置
// Increase size
++ev_size;//记录队列使用情况
ev_queue[ev_rear] = ev;//这里直接赋值
}
return TRUE;
}
-从队列获取数据
boolean get_event( event *ev )
{
if( is_ev_queue_empty() )
{
return FALSE;
}
// Move to first valid item's index
++ev_front;
ev_front %= MAX_SIZE;
// Decrease size
--ev_size;
// get data
*ev = ev_queue[ev_front];
return TRUE;
}
-清空队列
//清空队列只需将头尾和使用size直接重置就行了
void vp_clear_tc_ev_queue( void )
{
ev_front = -1;
ev_rear = -1;
ev_size = 0;
}