最新环形队列实现原理(1),又到一年金三银四

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单。能很快知道队列是否满为空。能以很快速度的来存取数据。

因为有简单高效的原因,甚至在硬件都实现了环形队列.

环形队列广泛用于网络数据收发,和不同程序间数据交换(比如内核与应用程序大量交换数据,从硬件接收大量数据)均使用了环形队列.

一.环形队列实现原理


内存上没有环形的结构,因此环形队列实上是数组的线性空间来实现。那当数据到了尾部如何处理呢?它将转回到0位置来处理。这个的转回是通过取模操作来执行的。

因此环列队列的是逻辑上将数组元素q[0]与q[MAXN-1]连接,形成一个存放队列的环形空间。

为了方便读写,还要用数组下标来指明队列的读写位置。head/tail.其中head指向可以读的位置,tail指向可以写的位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

环形队列的关键是判断队列为空,还是为满。当tail追上head时,队列为满时,当head追上tail时,队列为空。但如何知道谁追上谁。还需要一些辅助的手段来判断.

如何判断环形队列为空,为满有两种判断方法。

一.是附加一个标志位tag

当head赶上tail,队列空,则令tag=0,

当tail赶上head,队列满,则令tag=1,

二.限制tail赶上head,即队尾结点与队首结点之间至少留有一个元素的空间。

队列空:   head==tail

队列满:   (tail+1)% MAXN ==head

二.附加标志实现算法


采用第一个环形队列有如下结构

typedef struct ringq{
   int head; /* 头部,出队列方向*/
   int tail; /* 尾部,入队列方向*/ 
   int tag ;
   int size ; /* 队列总尺寸 */
   int space[RINGQ_MAX]; /* 队列空间 */
  
}RINGQ;

初始化状态: 
q->head = q->tail = q->tag = 0;

队列为空:(
q->head == q->tail) && (q->tag == 0)

队列为满
: ((q->head == q->tail) && (q->tag == 1))

入队操作:如队列不满,则写入

q->tail =  (q->tail + 1) % q->size ;

出队操作:如果队列不空,则从head处读出。

下一个可读的位置在 
q->head =  (q->head + 1) % q->size

完整代码

头文件ringq.h

#ifndef __RINGQ_H__
#define __RINGQ_H__

#ifdef __cplusplus
extern "C" {
#endif 

#define QUEUE_MAX 20

typedef struct ringq{
   int head; /* 头部,出队列方向*/
   int tail; /* 尾部,入队列方向*/ 
   int tag ; /* 为空还是为满的标志位*/
    int size ; /* 队列总尺寸 */
   int space[QUEUE_MAX]; /* 队列空间 */
}RINGQ;

/* 
  第一种设计方法:
     当head == tail 时,tag = 0 为空,等于 = 1 为满。
*/

extern int ringq_init(RINGQ * p_queue);

extern int ringq_free(RINGQ * p_queue);


/* 加入数据到队列 */
extern int ringq_push(RINGQ * p_queue,int data);

/* 从队列取数据 */
extern int ringq_poll(RINGQ * p_queue,int *p_data);


#define ringq_is_empty(q) ( (q->head == q->tail) && (q->tag == 0))

#define ringq_is_full(q) ( (q->head == q->tail) && (q->tag == 1))

#define print_ringq(q) printf("ring head %d,tail %d,tag %d\n", q->head,q->tail,q->tag);
#ifdef __cplusplus
}
#endif 

#endif /* __RINGQ_H__ */

实现代码 ringq.c

#include <stdio.h>
#include "ringq.h"

int ringq_init(RINGQ * p_queue)
{
   p_queue->size = QUEUE_MAX ;
   
   p_queue->head = 0;
   p_queue->tail = 0;
   
   p_queue->tag = 0;
   
   return 0;
}

int ringq_free(RINGQ * p_queue)
{
  return 0;
}


int ringq_push(RINGQ * p_queue,int data)
{
  print_ringq(p_queue);
  
  if(ringq_is_full(p_queue))
   {
     
     printf("ringq is full\n");
     return -1;
   }
      
   p_queue->space[p_queue->tail] = data;
   
   p_queue->tail = (p_queue->tail + 1) % p_queue->size ;
   
   /* 这个时候一定队列满了*/
   if(p_queue->tail == p_queue->head)
    {
       p_queue->tag = 1;
    }

    return p_queue->tag ;  
}

int ringq_poll(RINGQ * p_queue,int * p_data)
{
   print_ringq(p_queue);
  if(ringq_is_empty(p_queue))
   {
      
      printf("ringq is empty\n");
     return -1;
   }
   
   *p_data = p_queue->space[p_queue->head];
   
   p_queue->head = (p_queue->head + 1) % p_queue->size ;
   
    /* 这个时候一定队列空了*/
   if(p_queue->tail == p_queue->head)
    {
       p_queue->tag = 0;
    }    
    return p_queue->tag ;
}

测试代码

/* 测试第一种环形队列*/
void test5()
{
  RINGQ rq, * p_queue;
  int i,data;
  
  p_queue = &rq;
  
  ringq_init(p_queue);
  
  for(i=0; i < QUEUE_MAX +2 ; i++)
  {
   
   ringq_push(p_queue,i+1); 
  } 
    
  if(ringq_poll(p_queue,&data)>=0)
     PRINT_INT(data);
  
  if(ringq_poll(p_queue,&data)>=0)
     PRINT_INT(data);
  
  if(ringq_poll(p_queue,&data)>=0)
     PRINT_INT(data);
  
  if(ringq_poll(p_queue,&data)>=0)
     PRINT_INT(data);
  
  if(ringq_poll(p_queue,&data)>=0)
     PRINT_INT(data);
  
  if(ringq_poll(p_queue,&data)>=0)
     PRINT_INT(data);
  
  ringq_free(p_queue);
}

/* 测试第一种环形队列,更加复杂的情况*/
void test6()
{
  RINGQ rq, * p_queue;
  int i,data;
  
  p_queue = &rq;
  
  ringq_init(p_queue);
  
  
   ringq_push(p_queue,1); 
   
   ringq_push(p_queue,2); 
  


![img](https://img-blog.csdnimg.cn/img_convert/606edfafd5199652a29b0a58f6dc829f.png)
![img](https://img-blog.csdnimg.cn/img_convert/a62de1082cd203549e5d4850b6b10065.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

 
   
   ringq_push(p_queue,2); 
  


[外链图片转存中...(img-lUtVNkPZ-1715879855856)]
[外链图片转存中...(img-yywyCNaY-1715879855856)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

<think>嗯,用户问的是关于“金三银 招聘 职业发展 IT行业”。首先,我需要确认“金三银”是什么意思。好像这是中国招聘市场的旺季,通常指三月和月,企业大量招聘,求职者活跃。接下来,用户可能想知道这段时间对IT行业的影响,以及如何利用这个时期进行职业发展。 我应该先搜索“金三银 IT行业招聘”来确认具体的时间段和相关趋势。然后,查找IT行业在这段时间的岗位需求,比如哪些职位更热门,技术方向是否有变化。另外,用户可能关心职业发展建议,比如如何准备面试,技能提升方向。 还需要注意用户提到的职业发展,所以可能需要包括如何规划晋升、跳槽注意事项,以及长期发展的建议。可能还需要涉及招聘流程中的优化策略,比如简历优化、薪资谈判等。 另外,用户可能没有直接问,但潜在的问题可能包括如何评估offer,或者金三银之后的市场情况。需要确保回答全面,覆盖求职策略和职业规划,同时结合IT行业的特殊性,比如技术栈的重要性,远程面试的趋势等。 最后,生成相关问题时要基于回答内容,比如金三银的持续时间、IT行业的高需求岗位、职业发展中的技能提升方法等。确保问题相关且有延伸性,帮助用户进一步探索。</think>**金三银期间IT行业招聘与职业发展指南** **招聘市场特点分析** IT行业在3-4月呈现岗位释放高峰,互联网、人工智能、云计算等领域需求显著。头部企业通常在此阶段完成全年60%以上招聘配额,初级开发岗与资深架构师岗竞争差异明显,前者投递比可达30:1,后者因人才稀缺呈现供不应求态势。 **职业发展策略** - **技能匹配优化**:重点提升主流技术栈竞争力,2023年市场数据显示,掌握$Python/Java$全栈开发能力者平均薪资溢价18%,具备$TensorFlow/PyTorch$框架经验的人工智能工程师薪酬中位数超25K/月 ```python # 技术栈竞争力评估模型示例 def skill_score(years_exp, projects, certifications): return 0.4*years_exp + 0.35*projects + 0.25*certifications ``` - **求职路径规划**:建立多维度求职网络,头部招聘平台(BOSS直聘、猎聘)日均新增IT岗位3000+,内推成功率较海投高47%。建议采用漏斗模型:目标企业清单→岗位匹配度分析→定制化简历投递 - **薪酬谈判策略**:利用市场基准数据(如拉勾网《IT行业薪酬报告》)进行议价,一线城市中级开发岗薪资区间$[18k,35k]$,浮动部分可通过期权/绩效结构优化。薪酬计算公式: $$总包=基本工资×12 + 年终奖 + 股票期权现值$$ **风险规避措施** 审慎评估企业现金流状况,2023年IT初创企业存活率同比下降12%。建议通过企查查等工具核查融资轮次(B轮后企业稳定性提升23%),关注研发投入占比(健康值应>15%)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值