现在的位置: 首页 > 综合 > 正文

利用数组实现队列操作

2014年02月23日 ⁄ 综合 ⁄ 共 1366字 ⁄ 字号 评论关闭

利用数组实现队列操作

本文博客链接: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 ...

抱歉!评论已关闭.