本文共 1660 字,大约阅读时间需要 5 分钟。
利用数组实现队列操作
本文博客链接:,作者:jdh,转载请注明.
说明:
项目中有30台分机,每台分机都可能发出请求,主机需要按顺序响应这些请求.这是一个FIFO先进先出的队列结构,但主机的CPU是单片机,用链表实现占用资源太多,所以尝试用数组实现.
思路:
定义1个数组,用下标表示分机号,用其中的值表示在队列中的位置.
源代码:
#include//队列长度#define LEN 30int 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,没有返回0int 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队尾是25Terminated with return code 0Press any key to continue ...再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!