数据结构小结 (三)栈与队列

本文详细介绍了队列这一数据结构的实现方式,包括使用数组(循环队列)和链表两种方法。阐述了队列的基本操作如入队、出队等,并提供了具体的代码示例。

第三章 栈 与 队列

前言

上一篇说了栈,这篇来说说队列,依然是使用数组与链表这两种

数据结构来具体实现。

队列

队列(queue) 也是表,然而,使用队列时插入在一端进行而在另一端进行删除操作。

对与队列而言,不论是使用队列或者使用链表都是快速的O(1)时间完成操作。

核心思想

先进先出

队列的数组实现

几个需要注意的点

队列可以使用数组与链表实现

数组实现:

其实数组实现就是我们常说的循环队列,循环队列的应用很多,比如作为缓冲区使用,内核就

是使用队列原理实现的内核缓冲区。

然而更重要的就是判断空队列,判断满队列的方法了,根据设置不同方法也不尽相同, 我们这

里使用的是少用一块空间的方法,判断队列空或者满。当然我们这里也是不保证线程安全的,

如果你需要保证线程安全,简单的就加一把锁,多处理器加自旋锁。也可以考虑无锁技术。

数组实现队列的一些前提

[c]

#define MAX 10

#define SUCCESS 0

#define FAIL -1

/*这是一个循环队列,使用少用一个空间的办法解决判满判空的问题*/

typedef struct queue{

int front;

int rear ;

int count;

int * queue_array; /*这里使用一个指针也是为了以后能动态开辟大小空间*/

/*在linux kernel 中也有int * queue_array[0] 这

种写法,都是为了动态扩大*/

}queue;

[/c]

创建队列

[c]

queue * queue_create(void){

queue * Q;

Q = (queue *)malloc(sizeof(struct queue));

Q->queue_array = (int *)malloc(sizeof(int) * MAX);

Q->front = Q->rear = MAX -1;

Q->count = 0;

return Q;

}

[\c]
<h3>入队操作</h3>
[c]

int queue_in(queue * Q,int num){

if(!Q){

return FAIL;

}

if((Q->rear+1) % MAX == Q->front){

return FAIL;

}else{

Q->rear = (Q->rear + 1)%MAX;

Q->queue_array[Q->rear] = num;

Q->count++;

}

return SUCCESS;

}

[\c]
<h3>出队操作</h3>
[c]

int queue_out(queue * Q){

if(!Q){

return FAIL;

}

if(Q->front == Q->rear){

return FAIL;

}else{

Q->front = (Q->front+1)%MAX;

Q->count--;

return Q->queue_array[Q->front];

}

}

[/c]

判断队满

[c]

int EmptyisQueue(queue *Q){

if(Q->front == Q->rear){

return SUCCESS;

}else{

return FAIL;

}

}

[/c]

队列的链表实现

前提条件

[c]

typedef struct node{

int data;

struct node *next;

}_node;

typedef struct _node{

_node *head;

_node *tail ;

int count ;

}_ctl;

[/c]

入队操作

[c]

void que_inq(_ctl *ctl,_node *node){

if(NULL == ctl || NULL == node){

return ;

}

if(!ctl->count){

ctl->head = node ;

}else{

ctl->tail->next = node ;

}

ctl->tail = node ;

node->next = NULL;

ctl->count++;

}

[/c]

出队操作

[c]

_node * que_deq(_ctl * ctl){

_node *rst = NULL;

if(NULL == ctl){

return NULL;

}

rst = ctl->head;

if(rst){

ctl->head = rst->next;

ctl->count--;

rst->next = NULL;

}

return rst;

}

[/c]

删除一个队列

[c]

void que_del(_ctl *ctl){

_node *pos = NULL;

if(NULL == ctl){

return ;

}

pos = ctl->head;

while(pos != NULL){

ctl->head = pos->next;

free(pos);

pos = ctl->head;

}

}

[/c]

创建一个队列

[c]

void que_create(_ctl *ctl ,int len){

_node *pnt = NULL ;

int fact = 0 ;

if(NULL == ctl || len < 1){

return ;

}

while(fact < len){

pnt = (_node *)malloc(sizeof(_node));

pnt->data = fact + 1;

que_inq(ctl,pnt);

fact++;

}

}

[/c]

查看原文:http://zmrlinux.com/2015/12/20/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e5%b0%8f%e7%bb%93-%ef%bc%88%e4%b8%89%ef%bc%89%e6%a0%88%e4%b8%8e%e9%98%9f%e5%88%97/

基于粒子群优化算法的p-Hub选址优化(Matlab代码实现)内容概要:本文介绍了基于粒子群优化算法(PSO)的p-Hub选址优化问题的研究实现,重点利用Matlab进行算法编程仿真。p-Hub选址是物流交通网络中的关键问题,旨在通过确定最优的枢纽节点位置非枢纽节点的分配方式,最小化网络总成本。文章详细阐述了粒子群算法的基本原理及其在解决组合优化问题中的适应性改进,结合p-Hub中转网络的特点构建数学模型,并通过Matlab代码实现算法流程,包括初始化、适应度计算、粒子更新收敛判断等环节。同时可能涉及对算法参数设置、收敛性能及不同规模案例的仿真结果分析,以验证方法的有效性鲁棒性。; 适合人群:具备一定Matlab编程基础优化算法理论知识的高校研究生、科研人员及从事物流网络规划、交通系统设计等相关领域的工程技术人员。; 使用场景及目标:①解决物流、航空、通信等网络中的枢纽选址路径优化问题;②学习并掌握粒子群算法在复杂组合优化问题中的建模实现方法;③为相关科研项目或实际工程应用提供算法支持代码参考。; 阅读建议:建议读者结合Matlab代码逐段理解算法实现逻辑,重点关注目标函数建模、粒子编码方式及约束处理策略,并尝试调整参数或拓展模型以加深对算法性能的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值