设有一个具有n个单元的循环队列,设头指针为f,尾指针为r,试写出一个算法,求队列中的元素的个数

Python019

设有一个具有n个单元的循环队列,设头指针为f,尾指针为r,试写出一个算法,求队列中的元素的个数,第1张

#define MAXQSIZE 100

#include <stdio.h>

#include <stdlib.h>

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define OVERFLOW -2

typedef int QElemType

typedef int Status

//队列的顺序存储结构

typedef struct{

QElemType *base//初始化的动态分配空间

int front//头指针,若队列不空,指向队列头元素

int rear//尾指针,若队列不空,指向队列元素的下一个位置

}SqQueue

void showmenu() //功能列表函数

{

printf("\n **********功能**********\n")

printf(" * 1.队列遍历 *\n")

printf(" * 2.进队 *\n")

printf(" * 3.出队 *\n")

printf(" * 4.队头元素 *\n")

printf(" * 5.队列长度 *\n")

printf(" * 6.清空队列 *\n")

printf(" * 0.返回程序 *\n")

printf(" ************************\n")

printf("请输入所需功能: ")

}

//循环队列的基本操作

Status InitQueue(SqQueue &Q)

{//构造一个空队列Q

Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType))

if(!Q.base) exit(OVERFLOW)//存储分配失败

Q.front=Q.rear=0

return OK

}

Status DestroyQueue(SqQueue &Q)

{

if(Q.base)

free(Q.base)

Q.base=NULL

return OK

}

Status ClearQueue(SqQueue &Q)

{

Q.front=Q.rear=0

return OK

}

Status QueueEmpty(SqQueue &Q)

{

if(Q.front==Q.rear)//队列空的标志

return TRUE

else

return FALSE

}

int QueueLength(SqQueue &Q)

{

return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE

}

Status GetHead(SqQueue Q,QElemType &e)

{//若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR

if(Q.front==Q.rear)//队列空

return ERROR

e=*(Q.base+Q.front)

return OK

}

Status EnQueue(SqQueue &Q,QElemType e)

{

if((Q.rear+1)%MAXQSIZE==Q.front)//队列满

return ERROR

Q.base[Q.rear]=e

Q.rear=(Q.rear+1)%MAXQSIZE

return OK

}

Status DeQueue(SqQueue &Q,QElemType &e)

{

if(Q.front==Q.rear)//队列空

return ERROR

e=Q.base[Q.front]

Q.front=(Q.front+1)%MAXQSIZE

}

Status QueueTraverse(SqQueue Q)

{

int i

i=Q.front

while(i!=Q.rear)

{

printf("%d ",*(Q.base+i))

i=(i+1)%MAXQSIZE

}

printf("\n")

return OK

}

int main()

{

SqQueue Q

QElemType e

InitQueue(Q)

int i,n,choice

printf("请输入队列的长度:")

scanf("%d",&n)

printf("请将数据依次入队:\n")

for(i=0i<ni++)

{

scanf("%d",&e)

EnQueue(Q,e)

}

showmenu()

scanf("%d",&choice)

while(choice!=0) //输入时候退出程序

{

switch(choice)

{

case 1:

{

printf("队列遍历: \n")

if(!QueueEmpty(Q))

QueueTraverse(Q)

else

printf("队列为空\n")

break

}

case 2:

{

printf("输入进队元素:\n")

scanf("%d",&e)

EnQueue(Q,e)

break

}

case 3:

{ if(!QueueEmpty(Q))

{DeQueue(Q,e)

printf("出队元素为:%d\n",e)}

else

printf("队列为空!\n")

break

}

case 4:

{

printf("队头元素为:")

GetHead(Q,e)

printf("%d\n",e)

break

}

case 5:

{

printf("队列长度为:")

printf("%d\n",QueueLength(Q))

break

}

case 6:

{

printf("清空队列后:")

ClearQueue(Q)

if(QueueEmpty(Q))

printf("队列为空\n")

else

printf("队列不为空\n")

break

}

default:

printf("输入错误,请重新输入:\n")

}

printf("输入功能序号:\n")

scanf("%d",&choice)

}

return 0

}

#include <stdio.h>

#include <malloc.h>

#define Maxqsize 5

typedef char ElemType

typedef struct

{

ElemType elem[Maxqsize]

int front,rear

}SqQueue

void InitQueue(SqQueue *&q)

{

q=(SqQueue *)malloc (sizeof(SqQueue))

q->front=q->rear=0

}

void ClearQueue(SqQueue *&q)

{

free(q)

}

int QueueLength(SqQueue *q)

{

return (q->rear-q->front+Maxqsize)%Maxqsize

}

int QueueEmpty(SqQueue *q)

{

return(q->front==q->rear)

}

int enQueue(SqQueue *&q,ElemType e)

{

if ((q->rear+1)%Maxqsize==q->front)

return 0

q->rear=(q->rear+1)%Maxqsize

q->elem[q->rear]=e

return 1

}

int deQueue(SqQueue *&q,ElemType &e)

{

if (q->front==q->rear)

return 0

q->front=(q->front+1)%Maxqsize

e=q->elem[q->front]

return 1

}

void main()

{

ElemType e

SqQueue *q

printf("(1)初始化队列Q\n")

InitQueue(q)

printf("(2)依次进队列元素A,B,C\n")

if (enQueue(q,'A')==0) printf("队满,不能进队\n")

if (enQueue(q,'B')==0) printf("队满,不能进队\n")

if (enQueue(q,'C')==0) printf("队满,不能进队\n")

printf("(3)队列为%s\n",(QueueEmpty(q)?"空":"非空"))

if (deQueue(q,e)==0)

printf("队空,不能出队\n")

else

printf("(4)出队一个元素%c\n",e)

printf("(5)队列Q的元素个数:%d\n",QueueLength(q))

printf("(6)依次进队列元素D,E,F\n")

if (enQueue(q,'D')==0) printf("队满,不能进队\n")

if (enQueue(q,'E')==0) printf("队满,不能进队\n")

if (enQueue(q,'F')==0) printf("队满,不能进队\n")

printf("(7)队列Q的元素个数:%d\n",QueueLength(q))

printf("(8)出队列序列:")

while (!QueueEmpty(q))

{ deQueue(q,e)

printf("%c ",e)

}

printf("\n")

printf("(9)释放队列\n")

ClearQueue(q)

}

#include<stdio.h>//循环队列的存储结构

#include<stdlib.h>

#define OVERFLOW -2

#define maxqsize 100

typedef int QElemType

typedef struct {

QElemType *base

int front

int rear

}SqQueue

void InitQueue(SqQueue *Q)

{//构造一个空队列Q

Q->base=(QElemType *)malloc(maxqsize * sizeof(QElemType))//申请空间

if(!Q->base) exit(OVERFLOW)//若没有申请到空间,则溢出出错

Q->front=Q->rear=0

}

void ClearQueue(SqQueue *Q)

{//置空

Q->front=Q->rear//将首尾指针指向同一处

}

void EnQueue(SqQueue *Q,QElemType e)

{//入队

printf("please input tne number you want input\n")

scanf("%d",&e)

if((Q->rear+1)%maxqsize==Q->front) {printf("sorry The Queue is full!\nNOW The Program will be out!\n")exit(0)}//队尾指针已经指向循环队列的最大长度,则不能入队列

Q->base[Q->rear]=e//将元素入队列

Q->rear=(Q->rear+1)%maxqsize//改变队尾指针的值

printf("congratulation Enqueue successful\n")

}

void DeQueue(SqQueue *Q,QElemType e)

{//出队

if(Q->front==Q->rear) {printf("Sorry the queue is empty\nNOW The Program will be out!\n")exit(0)}//首尾指针指向同一处证明队列为空,没有元素可以退栈

e=Q->base[Q->front]//将队首元素出栈

Q->front=(Q->front+1)%maxqsize//队首指针后移

printf("congratulation dequeue successful\n")

}

void QueueLength(SqQueue *Q)

{//求队列长度

printf("the length of the queue is %d\n",(Q->rear-Q->front+maxqsize)%maxqsize)

}

void PrintQueue(SqQueue *Q)

{//打印队列

int i=1

if(Q->front==Q->rear) printf("Sorry The Queue is Empty\n")

while(Q->front!=Q->rear)//while(Q->front!=(Q->rear+1)%maxqsize)//以后者作为循环条件,用前者的话最后一个不能打印

{

printf("Queue the %dth is %d \n",i++,Q->base[Q->front])

Q->front++

}

}

void DestroyQueue(SqQueue *Q)

{//销毁队列

if(!Q->base) free(Q->base)

Q->base=NULL

Q->rear=Q->front

printf("DestroyQueue is OK!\nNOW The Program will be out!\n")

exit(0)

}

int main()

{

SqQueue Q

QElemType e

int i

InitQueue(&Q)

printf("please input what you want to do\nfor 0:over\n1:clearQueue\n2:EnQueue\n3:DeQueue\n4:find Queue length\n5:print Queue\n")

scanf("%d",&i)

while(i)

{

switch(i)

{

case 1:ClearQueue(&Q)break

case 2:EnQueue(&Q,e)break

case 3:DeQueue(&Q,e)break

case 4:QueueLength(&Q)break

case 5:PrintQueue(&Q)break

}

printf("you can input aagain :\nfor 0:over\n1:clearQueue\n2:EnQueue\n3:DeQueue\n4:find Queue length\n5:print Queue\n")

scanf("%d",&i)

}

return 0

}