利用数组实现队列操作
本文博客链接: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 ...