队列
来源:互联网 发布:创维网络电视价格 编辑:程序博客网 时间:2024/06/03 10:17
循环队列的初始化
void Init_Queue(PQUEUE pQ){ int len; printf("请输入您要生成队列的长度:"); scanf("%d", &len); len++;//因为会牺牲一个节点作为 Rear的最后一个存储结点,无效节点。所以len必须自加下; pQ->pBase = (int *)malloc(sizeof(int)*len);//利用结构体指针创建一个动态数组,队列的核心; pQ->Front = pQ->Rear = 0;//初始化时,pQ->Front 与 pQ->Rear 全为 ‘0’; return;}
循环队列的遍历
1). 先判断队列是否为空,如果空,无法遍历 2). 先定义一个临时变量 T , int T = pQ->Front; 然后利用 T 作为 动态数组的临时下标值,进行输出 注意: T 的 移动方式与 Front Rear 移动方式 必须相同。 bool Traverse_Queue(PQUEUE pQ){ if (Empty_Queue(pQ)) return false; else { int T = pQ->Front; while (T != pQ->Rear) { printf("%d ", pQ->pBase[T]); T = ( T + 1 ) % len; } } return true;}
判断循环队列是否为空
bool Empty_Queue(PQUEUE pQ)//当pQ->Front==pQ->Rear 队列此时便为空,因为只有在队列为空时,pQ->Front==pQ->Rear{ if (pQ->Front == pQ->Rear) return true; else return false;}
判断循环队列是否已满
bool Full_Queue(PQUEUE pQ)//当队列已满时,Front为第一个队中成员(也就是动态数组的下标值), //Rear为最后一个有效元素的下一个元素。 //所以 Rear的再下一个元素如果是Front时,此时队列便已满。{ if ((pQ->Rear + 1) % len == pQ->Front) return true; else return false;}
循环队列的出队
bool Out_Queue(PQUEUE pQ, int *pVal){ if (Empty_Queue(pQ)) return false; else { *pVal = pQ->pBase[pQ->Front]; pQ->Front = (pQ->Front + 1) % len; } return true;} 1). 先判断队列是否为空,如果已空,则无法进行出队操作 2). 先在主函数定义一个 int pVal; 然后 地址传递 ,然后指针接收。 3). 出队具体操作:先把此时 下标值为 pQ->Front 的动态数组的元素 赋给 pVal; 然后 pQ->Front 在移动,变为下一个元素的下标值。 总之: pQ->Front 永远指向 动态数组的 第一个元素。
循环队列的进队
bool In_Queue(PQUEUE pQ, int val){ if (Full_Queue(pQ)) return false; else { pQ->pBase[pQ->Rear] = val; pQ->Rear = (pQ->Rear + 1) % len; } return true;}1). 先判断队列是否已满,如果满了,便不能再进队。2). 进队操作:先把值赋给 下标值为 pQ->Rear 的动态数组 的元素,然后 Rear再往下移动。总之,下标值为 pQ->Rear 的动态数组元素 总是无效的元素。
代码如下:
include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <conio.h>typedef struct Queue{ int * pBase; int Front; int Rear;}QUEUE, *PQUEUE;int len;void Init_Queue(PQUEUE);bool In_Queue(PQUEUE, int);bool Out_Queue(PQUEUE, int *);bool Full_Queue(PQUEUE);bool Empty_Queue(PQUEUE);bool Traverse_Queue(PQUEUE);int main(void){ QUEUE Q; Init_Queue(&Q); int val, pVal, n; while (1) { system("cls"); printf("\n\n\n\t\t\n"); printf("\t\t 1.进队 \n"); printf("\t\t 2.出队 \n"); printf("\t\t 3.遍历 \n"); printf("\t\t 4.退出 \n"); printf("\n\n\n请输入选择项(1-4):"); scanf("%d", &n); switch (n) { case 1: printf("请输入进队元素:"); scanf("%d", &val); if (In_Queue(&Q, val)) printf("进队成功;\n"); else printf("队列已满,无法进队;\n"); break; case 2: if (Out_Queue(&Q, &pVal)) printf("出队成功,出队的元素是:%d;\n", pVal); else printf("队列为空,无法出队;\n"); break; case 3: if (!Traverse_Queue(&Q)) printf("队列为空,无法遍历;\n"); break; case 4:exit(-1); default: printf("您输入有误,请重新输入;\n"); break; } printf("请摁任意键继续;\n"); getch(); } return 0;}void Init_Queue(PQUEUE pQ){ printf("请输入您要生成队列的长度:"); scanf("%d", &len); len++; pQ->pBase = (int *)malloc(sizeof(int)*len); pQ->Front = pQ->Rear = 0; return;}bool Full_Queue(PQUEUE pQ){ if ((pQ->Rear + 1) % len == pQ->Front) return true; else return false;}bool Empty_Queue(PQUEUE pQ){ if (pQ->Front == pQ->Rear) return true; else return false;}bool In_Queue(PQUEUE pQ, int val){ if (Full_Queue(pQ)) return false; else { pQ->pBase[pQ->Rear] = val; pQ->Rear = (pQ->Rear + 1) % len; } return true;}bool Out_Queue(PQUEUE pQ, int *pVal){ if (Empty_Queue(pQ)) return false; else { *pVal = pQ->pBase[pQ->Front]; pQ->Front = (pQ->Front + 1) % len; } return true;}bool Traverse_Queue(PQUEUE pQ){ if (Empty_Queue(pQ)) return false; else { printf("遍历队列得:"); int T = pQ->Front; while (T != pQ->Rear) { printf("%d ", pQ->pBase[T]); T = (T + 1) % len; } } printf("\n"); return true;}
0 0
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- 队列
- maven国内镜像(maven下载慢的解决方法)
- 局部变量返回值问题
- 树---2.遍历
- MFC使用HttpGet和HttpPost方法与服务器通信
- [LeetCode] 58. Length of Last Word java
- 队列
- librtmp 日志的修改和操作
- 设计模式之工厂方法模式|抽象工厂模式
- Web前端代码构建优化
- JAVA中String字符串的各种基本操作
- Debugging Tips and Tricks for C++ in Visual Studio
- Redis单机集群配置和java客户端
- IntelliJ Idea 常用快捷键列表
- http接口、api接口、RPC接口、RMI、webservice、Restful等概念