队列的顺序存储结构的实现
1)编写完成下列功能的函数:(1)初始化一个空队列;(2)创建一个包含 5 个不大于100 的正整数值的队列(5 个值由计算机随机产生);(3)将一个数 x 插到队尾(x 在程序运行时输入);(4)删除队头元素,并在删除结束后输出删除元素的值;( 5)输出队列中所有元素;(6)求队列中元素的个数。
顺序存储结构的循环队列定义
#define MAXSIZE 100 //最大长度
Typedef struct {
QElemType *base; //初始化的动态分配存储空间
int front; //头指针
int rear; //尾指针
}SqQueue;
顺序队列的插入和删除时,要判断队列空和队列满。
栈空:Q.front = Q.rear;
栈满:(Q.rear+1) % MAXSIZE = Q.front
栈长:(Q.rear - Q.front + MAXSIZE)%MAXSIZE
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef struct{
int *base;
int front;
int rear;
}SqQueue;
int InitQueue(SqQueue &Q);
void CreateQueue(SqQueue &Q);
int EnQueue(SqQueue &Q,int x);
int DeQueue(SqQueue &Q,int &e);
int QueueLength(SqQueue Q);
int PrintQueue(SqQueue Q);
int InitQueue(SqQueue &Q)
{//初始化
Q.base = (int*)malloc(MAXSIZE *sizeof(int));
if (!Q.base)
return ERROR;
Q.front = Q.rear = 0;//头指针和尾指针都指向队头
return OK;
}
void CreateQueue(SqQueue &Q)
{//创建
int i,a;
//S.base= (int*)malloc(MAXSIZE *sizeof(int));
//S.top = S.base;
printf("循环队列的长度为:");
scanf("%d",&a);
srand((unsigned)time(NULL));
for(i = 0;i < a;i++ )
{
Q.base[Q.rear] = rand() % 100 +1;
Q.rear = (Q.rear+1) % MAXSIZE;//尾指针循环+1
}
}
int EnQueue(SqQueue &Q,int x)
{//插入
if ((Q.rear+1) % MAXSIZE == Q.front) //插入先判断队列满
return ERROR;
Q.base[Q.rear] = x;
Q.rear = (Q.rear+1) % MAXSIZE;//尾指针循环+1
return OK;
}
int DeQueue (SqQueue &Q,int &e)
{//删除
if (Q.front == Q.rear)//删除先判断队列空
return ERROR;
e = Q.base[Q.front];
//printf("删除元素为%d\n",e);
Q.front = (Q.front+1) % MAXSIZE;//头指针循环+1
return OK;
}
int QueueLength(SqQueue Q)
{//队列长度
if(Q.front==Q.rear)
return ERROR;
return (Q.rear - Q.front + MAXSIZE)%MAXSIZE;
}
int PrintQueue(SqQueue Q)
{//遍历
for(int p = Q.front;Q.front!=Q.rear;p++)
{
printf("%d ",Q.base[Q.front]);
Q.front = (Q.front+1) % MAXSIZE;
}
return OK;
}
int main()
{
int a,k,f,x,i,c,e;
SqQueue Q;
for(k = 0;;k++)
{
printf("\n1.初始化一个顺序队列\n");
printf("2.创建一个正整数的顺序队列\n");
printf("3.插入某个元素到队尾\n");
printf("4.删除某个队头元素\n");
printf("5.队列长\n");
printf("6.遍历元素\n");
printf("7.退出程序\n");
printf("输入你的选择:\n");
scanf("%d",&a);
switch (a)
{
case 1:
f = InitQueue(Q);
if(f == 1)
printf("创建队列成功!\n");
break;
case 2:
CreateQueue(Q);
PrintQueue(Q);
break;
case 3:
printf("你想插入的数为:");
scanf("%d",&x);
EnQueue(Q,x);
PrintQueue(Q);break;
case 4:
c = DeQueue(Q,e);
printf("删除元素为%d\n",c);
PrintQueue(Q);break;
case 5:
i = QueueLength(Q);
printf("队列长为:%d",i);break;
case 6:PrintQueue(Q);break;
case 7:exit(0);
}
}
return OK;
}