循环队列
来源:互联网 发布:计字器软件 编辑:程序博客网 时间:2024/06/16 21:33
顺序队列图示:
由于顺序的非环状的队列不能很好地判断队列是否为满,造成假溢出的现象,因此引入循环队列很好地解决了这一问题
循环队列图示:
1.循环队列牺牲一个存储空间来区分队满和队空(牺牲一个存储空间只是其中一种解决方案),最大存储空间为 Maxsize-1;
2.队满条件: (q->rear+1)%Maxsize ==q->front
3.对空条件:q->front==q->rear
4.队中元素的个数: num=(q->rear-q->front+Maxsize)%Maxsize;
源代码如下:
SqQueue.h
//顺序存储队列 #define Maxsize 6#define Elemtype int typedef struct{ Elemtype data[Maxsize]; //数据域 Elemtype front,rear; //头尾指针 }Queue;//函数声明 Queue InitQueue(); //队列初始化 void printQueue(Queue *q); //打印队列 void EnQueue(Queue *q,Elemtype e); //入队操作Elemtype DeQueue(Queue *q); //出队操作
SqQueue.c
//队列的顺序存储 #include "SqQueue.h" #include <stdio.h> #include<stdlib.h> int main() { int n=1; Queue q; q=InitQueue(); printQueue(&q); while(n!=0) { printf("\t\t/////////////////////////\n"); printf("\t\tinput your choice \n"); printf("\t\t1.En Queue \n"); printf("\t\t2.De Queue \n"); printf("\t\t/////////////////////////\n"); scanf("%d",&n); switch(n) { int m,p; case 1: printf("1.input the elem you want to push\n"); scanf("%d",&m); EnQueue(&q,m); printQueue(&q); break; case 2: p=DeQueue(&q); printf(" 元素 %d 出队列! \n",p); printQueue(&q); break; default: break; } } return 0; } Queue InitQueue() //队列初始化 { Queue q ; int n,m,i; q.front=0; q.rear=0; printf("input the numble of elem you want to add\n"); scanf("%d",&n); printf("input the elem \n"); for(i=0;i<n;i++) { scanf("%d",&m); q.data[i]=m; q.rear++; printf("队尾指针:%d\n",q.rear); } return q; } void EnQueue(Queue *q,Elemtype e)//入队操作 { //判断队满 if((q->rear+1)%Maxsize ==q->front) { printf("the queue is full!\n"); }else{ q->data[q->rear]=e; q->rear=(q->rear+1)%Maxsize; //队尾指针进一 printf("队尾指针:%d\n",q->rear); } } Elemtype DeQueue(Queue *q) //出队操作 { //判断队空 int head; if(q->front==q->rear) { printf("the queue is empty!\n"); return NULL; } else{ head=q->front; q->front=(q->front+1)%Maxsize; //队首元素进一 return q->data[head]; } } void printQueue(Queue *q) //打印队列 { int i,num,n; printf("print the Queue!\n"); /* for( i=q->front;i<q->rear;i++) //传统的遍历法,行不通 { printf("%d ",q->data[i]); // } */ //打印得到元素的个数 ,传统的遍历行不通 num=(q->rear-q->front+Maxsize)%Maxsize; for(i=q->front,n=0;n<num;n++,i=(i+1)%Maxsize) { printf("%d ",q->data[i]); } printf("\n"); printf("此时的队首指针:%d\n",q->front); printf("此时的队尾指针:%d\n",q->rear); printf("\n"); }
//其他队列常见的基本操作如判断队空队满,读队头元素等包含在上面的代码中,没有单独写成函数了
0 0
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- 循环队列
- ECNU_OJ_1079
- 职业生涯转型
- java初学之学习 变量数位,数据类型等
- HDU 1061 Rightmost Digit
- bzoj 3540: [Usaco2014 Open]Fair Photography
- 循环队列
- kd tree
- cocos2dx3.x 观察者模式
- 抓取淘宝MM的照片
- 人工智能——神经网络算法初体验
- 嵌套类的语法
- CodeForces 598A Tricky Sum(思维)
- Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理
- Ubuntu下常见目录的作用