利用数组实现队列操作

利用数组实现队列操作


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


说明:

项目中有30台分机,每台分机都可能发出请求,主机需要按顺序响应这些请求.这是一个FIFO先进先出的队列结构,但主机的CPU是单片机,用链表实现占用资源太多,所以尝试用数组实现.


思路:

定义1个数组,用下标表示分机号,用其中的值表示在队列中的位置.


源代码:

#include <stdio.h>

//队列长度
#define LEN 30
int arr[LEN];

//初始化队列
void init_list()
{
	int i = 0;
	for (i = 0;i < LEN;i++)
	{
		arr[i] = 0;
	}
}

//获得指定标号的队列位置
int get_pos(int index)
{
	return arr[index];
}

//获得队首标号
int get_head()
{
	int i = 0;
	int index = 0;
	
	for(i = 1;i < LEN;i++)
	{
		if (get_pos(index) == 0 && get_pos(i) > 0)
		{
			index = i;
			continue;
		}
		
		if (get_pos(i) != 0 && get_pos(i) < arr[index])
		{
			index = i;
		}
	}
	
	return index;
}

//获得队尾标号
int get_end()
{
	int i = 0;
	int index = 0;
	
	for(i = 1;i < LEN;i++)
	{
		if (arr[i] > arr[index])
		{
			index = i;
		}
	}
	
	return index;
}

//检查队列中是否有对应标号
//有返回1,没有返回0
int check_in(int index)
{
	if (arr[index] > 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//进栈
int push(int index)
{
	int i = 0;
	
	//检查是否已经在队列中
	if (check_in(index) != 0)
	{
		return 0;
	}
	
	//获得队尾标号
	i = get_end();
	//插入队尾
	arr[index] = get_pos(i) + 1;
	
	return 1;
}

//出栈
void pop()
{
	int i = 0;
	
	//获得队首标号
	i = get_head();
	//出栈
	arr[i] = 0;
	//其他标号前移1位
	for (i = 0;i < LEN;i++)
	{
		if (get_pos(i) > 1)
		{
			arr[i]--;
		}
	}
}

int main()
{
	//测试操作
	//初始化队列
	init_list();
	//入栈
	push(3);
	push(5);
	push(7);
	push(9);
	push(25);
	//输出队首标号
	printf("队首是%d\n",get_head());
	//输出队尾标号
	printf("队尾是%d\n",get_end());
	//出栈
	pop();
	//输出队首标号
	printf("队首是%d\n",get_head());
	//输出队尾标号
	printf("队尾是%d\n",get_end());
	//出栈
	pop();
	//输出队首标号
	printf("队首是%d\n",get_head());
	//输出队尾标号
	printf("队尾是%d\n",get_end());
	
	return 0;
}


输出:

队首是3
队尾是25
队首是5
队尾是25
队首是7
队尾是25


Terminated with return code 0
Press any key to continue ...




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值