保定网站开发公司,推广赚钱的app有哪些,网站建设与管理李洪心,一个做礼品的网站一、队列 FIFO
特点#xff1a;先进先出#xff0c;后进后出
允许从一段插入数据#xff0c;另一端删除数据的线性存储结构
队尾#xff1a;插入数据 入队
队头#xff1a;删除数据 出队
管道实质上也是一个队列。
用途#xff1a;缓存数据#xff08;主要是避免两…一、队列 FIFO
特点先进先出后进后出
允许从一段插入数据另一端删除数据的线性存储结构
队尾插入数据 入队
队头删除数据 出队
管道实质上也是一个队列。
用途缓存数据主要是避免两者速度不匹配的数据存取速度不匹配。
二、队列类型
2.1、顺序队列
顺序队列---------》假溢出-----------------》循环队列如果用顺序队列里面我们主要用的就是循环队列
队列中的假溢出是指当队列的存储空间实际上还有空闲位置时由于队列的访问限制导致无法插入新的元素从而表现出“溢出”的假象。在循环队列中这种情况尤为常见。
循环队列是一种使用数组存储数据元素的线性数据结构它利用数组的环状特性来处理队列的入队和出队操作。在循环队列中通常有两个指针front和rear分别指向队列的第一个元素和最后一个元素的下一个位置。队列的空和满的条件是相同的都是(rear 1) % queueSize front其中queueSize是队列的容量。因此当队列满时即使数组中有空间也会因为队列的规则认为它已经满了无法再添加新元素这时如果尝试入队就会产生假溢出。
解决假溢出的方法
为了避免假溢出可以在定义循环队列的时候预留一个位置通常在初始化队列时将front和rear都设置为0但在判断队列满的条件中加入一个额外的判断条件比如rear front时队列为空而(rear 1) % queueSize front时队列为满。
2.2、链式队列
1、创造队列
Queue_t *create_queue()
{Queue_t *queue malloc(sizeof(Queue_t));if(queue NULL){return NULL;}queue-pfront NULL;queue-prear NULL;queue-clen 0;pthread_mutex_init((queue-mutex),NULL);return queue;
}
2、入队
int push_queue(Queue_t *queue,QDataType data)
{QNode_t *qnode malloc(sizeof(QNode_t));if(qnode NULL){perror(malloc fail);return -1;}qnode-data data;qnode-pnext NULL;if(is_empty_queue(queue)){queue-prear qnode;queue-pfront qnode;}queue-prear-pnext qnode;queue-prear qnode;queue-clen;return 0;
}
3、出队
int pop_queue(Queue_t *queue,QDataType *data)
{if(is_empty_queue(queue)){return 0;}QNode_t *qnode queue-pfront;queue-pfront qnode-pnext;if(data ! NULL){*data qnode-data;}free(qnode);if(NULL queue-pfront){queue-prear NULL;}queue-clen--;return 0;
}
4、得到队头元素
int get_queue_front(Queue_t *queue,QDataType *data)
{QNode_t *q queue-pfront;*data q-data;return 0;
}
5、清空队列
void clear_queue(Queue_t *queue)
{while(!is_empty_queue(queue)){pop_queue(queue,NULL);/*QNode_t *qnode queue-pfront;queue-pfront qnode-pnext;free(qnode);queue-clen--;*/}
}
6、销毁队列 void destory_queue(Queue_t *queue)
{clear_queue(queue);free(queue);
}