#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 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
}