循环顺序队列
队列思想:
队列:操作受限的线性表。
1、只允许在表的一端进行插入(队尾),另一端删除(队头)。
2、约定少用一个单元,用于判断队满,即当队尾指针的下一个指向队头时,即队满。front == (rear + 1) % maxsize;
3、判空条件:front == rear;
代码实现:
环境:dev c++
#include<stdio.h>
#include<stdlib.h>
//顺序队列-循环
#define MaxSize 100//最大队列长度
typedef struct {
int *elem;//一维数组指针
int front;//队头指针, 指向队头元素
int rear;//队尾指针 ,指向队尾元素的下一个位置
}SqQueue;
//规定当队尾的下一个指向队头时,队列满。
//初始化队列
SqQueue InitSqQueue();
//入队
void EnSqQueue(SqQueue &Q,int e);
//出队
int DeSqQueue(SqQueue &Q,int &e);
int QueueLength(SqQueue Q);
//遍历队列
void PrintfSqQueue(SqQueue Q);
int main(){
SqQueue Q = InitSqQueue();
printf("初始化成功!");
printf("\n"); printf("\n");
//入队-输入0-i的值到队列中
int i;
printf("输入i值:");
scanf("%d",&i);
printf("将0-%d的整数值依次入队\n",i);
for(int j = 0;j<=i;j++){
EnSqQueue(Q,j);
}
printf("实现了入队操作!!\n");
printf("此时队列元素为:");
PrintfSqQueue(Q);
printf("\n"); printf("\n");
//出队
int e,k;
k = DeSqQueue(Q,e);
if(k){
printf("出队元素值为:%d\n",e);
}
printf("实现了出队操作!!\n");
printf("此时队列元素为:");
PrintfSqQueue(Q);
printf("\n"); printf("\n");
//队列长度
int QLength = 0;
QLength = QueueLength(Q);
printf("队列长度为:%d\n",QLength);
printf("实现了查找队列长度操作!!");
printf("\n"); printf("\n");
//遍历队列
printf("队列元素为:");
PrintfSqQueue(Q);
printf("实现了遍历操作!!");
return 0;
}
//初始化队列
SqQueue InitSqQueue(){
SqQueue p;
p.elem = (int *) malloc (MaxSize * sizeof(int));
if(!p.elem){
printf("分配空间失败!!");
exit(0);
}
p.front = p.rear = 0;
return p;
}
//入队
void EnSqQueue(SqQueue &Q,int e){
if((Q.rear + 1) % MaxSize == Q.front){
printf("入队操作失败,队列已满!!");
exit(0);
}
Q.elem[Q.rear] = e;
Q.rear = (Q.rear + 1) % MaxSize;
}
//出队
int DeSqQueue(SqQueue &Q,int &e){
if(Q.rear == Q.front){
printf("队列为空!!");
return 0;
}
e = Q.elem[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return 1;
}
//队列长度
int QueueLength(SqQueue Q){
int L = 0;
L = (Q.rear - Q.front + MaxSize) % MaxSize;
return L;
}
//遍历队列
void PrintfSqQueue(SqQueue Q){
if(Q.rear == Q.front){
printf("队列为空!!");
exit(0);
}
while(Q.front != Q.rear){
printf("%d ",Q.elem[Q.front]);
Q.front = (Q.front + 1) % MaxSize;
}
printf("\n");
}