数据结构 循环队列的顺序存储与链式存储
循环队列的顺序存储
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
typedef int QElemType;
typedef struct{ //对循环队列的结点的结构体进行定义
QElemType data[MaxSize];
int front; //头指针指向队首元素
int rear; //尾指针指向队尾元素的下一个位置
}SqQueue;
int InitQueue(SqQueue *Q){//初始化队列
Q->front=0;
Q->rear=0;
return 1;
}
int Length(SqQueue *Q){//求队列长度
int len=(Q->rear-Q->front+MaxSize)%MaxSize;
return len;
}
int EnQueue(SqQueue *Q,QElemType e){//入队列
if(Length(Q)+1==MaxSize){
printf("队列已满,数值%d无法进入\n",e);
return 0;
}
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MaxSize;
return 1;
}
int DeQueue(SqQueue *Q,QElemType *e){//出队列
if(Q->rear==Q->front){
printf("队列已空,无法出队列\n");
return 0;
}
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MaxSize;
return 1;
}
void Print(SqQueue *Q){
int i=0;
printf("\n");
if(Q->front>Q->rear){
while(Q->front+i==MaxSize){
printf("%d ",Q->data[Q->front+i]);
i++;
}
i=0;
while(i!=Q->rear){
printf("%d ",Q->data[i]);
i++;
}
}
else{
i=Q->front;
while(i!=Q->rear){
printf("%d ",Q->data[i]);
i++;
}
}
printf("\n");
}
int main(){
SqQueue Q;
InitQueue(&Q);
do{
printf(" 请选择要进行的操作: \n");
printf(" 1 创建一个循环队列 2 入队 3 出队 4 打印 0 退出 \n");
int select;
scanf("%d", &select);
if(select == 0)
break;
switch(select){
case 0:
break;
case 1:
printf("要创建的循环队列长度为:");
int n;//要创建的循环队列长度
scanf("%d",&n);
printf("请依次输入元素:");
int an;
for(int i=0;i<n;i++){//入队列
scanf("%d",&an);
EnQueue(&Q,an);
}
printf("队列长度为:%d \n",Length(&Q));
break;
case 2:
printf("请输入要入队的一个元素:");
scanf("%d",&an);
EnQueue(&Q,an);
break;
case 3:
int num;
int e;
printf("输入要删除的元素个数(从队首进行删除)\n");
scanf("%d",&num);
for(int i=0;i<num;i++){
if(!DeQueue(&Q,&e))
break;
printf("删除了一个元素%d,此时队列为:",e);
Print(&Q);
printf("\n");
}
break;
case 4:
Print(&Q);
break;
default:
printf("你进行了误操作,请重新选择\n:");
break;
}
}
while(1);
return 0;
}
循环队列的链式存储
#include<iostream>
#include<stdLib.h>
using namespace std;
//定义链队列
typedef struct Haha{
int data;
struct Haha *next;
}Haha, *que;
typedef struct{
que front;
que rear;
}link;
//对链队列初始化
void Init(link *q){
q->front = q->rear = (que)malloc(sizeof(Haha));
if(!(q->front))
exit(1);
q->front->next = 0;
}
//插入新元素
void En(link *q, int e){
que p;
p = (que)malloc(sizeof(Haha));
if(!p) exit(1);
p->data = e;
p->next = 0;
q->rear->next = p;
q->rear = p;
}
//删除队头元素
int de(link *q){
Haha *p;
int e;
if(q->front==q->rear) return -1;
p = q->front->next;
e=p->data;
q->front->next = p->next;
if(q->rear == p)
q->rear = q->front;
free(p);
cout << e << endl;
return 0;
}
//输出队列元素
void out(link *q){
Haha *r=q->front->next;
while(r){
cout << r->data<<' ';
r = r->next;
}
cout << endl;
}
//求队列长度
int len(link *q){
Haha *r=q->front->next;
int s = 0;
while(r){
r=r->next;
s++;
}
return s;
}
int main(){
link Q;
Init(&Q);
do{
printf(" 请选择要进行的操作: \n");
printf(" 1 创建一个链队列 2 入队 3 出队 4 打印 0 退出 \n");
int select;
scanf("%d", &select);
if(select == 0)
break;
switch(select){
case 0:
break;
case 1:
printf("要创建的循环队列长度为:");
int n;//要创建的循环队列长度
scanf("%d",&n);
printf("请依次输入元素:");
int an;
for(int i=0;i<n;i++){//入队列
scanf("%d",&an);
En(&Q,an);
}
printf("队列长度为:%d \n",len(&Q));
break;
case 2:
printf("请输入要入队的一个元素:");
scanf("%d",&an);
En(&Q,an);
break;
case 3:
printf("队首删除了一个元素\n");
if(!de(&Q))
break;
printf("删除了一个元素,此时队列为:");
out(&Q);
printf("\n");
break;
case 4:
out(&Q);
break;
default:
printf("你进行了误操作,请重新选择\n:");
break;
}
}
while(1);
return 0;
}