/*队列及其基本概念
队列的基本概念
队列(Queue):也是运算受限的线性表。是一种先进先出(First In First Out ,简称FIFO)的线性表。
只允许在表的一端进行插入,而在另一端进行删除。
*/
/*
队列的顺序表示和实现
利用一组连续的存储单元(一维数组) 依次存放从队首到队尾的各个元素,称为顺序队列。
设立一个队首指针front ,一个队尾指针rear ,分别指向队首和队尾元素。
◆ 初始化:front=rear=0。
◆ 入队:将新元素插入rear所指的位置,然后rear加1。
◆ 出队:删去front所指的元素,然后加1并返回被删元素。
◆ 队列为空:front=rear。
◆ 队满:rear=MAXQSIZE-1或front=rear。
*/
# include <stdio.h>
# include <malloc.h>
# define true 1
# define false 0
typedef int Status ;
typedef struct Queue
{
int * pBase; //数组基地址
int front; //队首指针front
int rear; //队尾指针rear
}QUEUE;
//队列的初始化
void init(QUEUE *pQ)
{
pQ->pBase = (int *)malloc(sizeof(int) * 6);
pQ->front = 0;
pQ->rear = 0;
}
//判断队满
Status full_queue(QUEUE * pQ)
{
if ( (pQ->rear + 1) % 6 == pQ->front )
return true;
else
return false;
}
//入队
Status en_queue(QUEUE * pQ, int val)
{
if ( full_queue(pQ) )
{
return false;
}
else
{
pQ->pBase[pQ->rear] = val;
pQ->rear = (pQ->rear+1) % 6;
return true;
}
}
//遍历队列
void traverse_queue(QUEUE * pQ)
{
int i = pQ->front;
while (i != pQ->rear)
{
printf("%d ", pQ->pBase[i]);
i = (i+1) % 6;
}
printf("\n");
}
//判断队空
Status emput_queue(QUEUE * pQ)
{
if ( pQ->front == pQ->rear )
return true;
else
return false;
}
//出队
Status out_queue(QUEUE * pQ, int * pVal)
{
if ( emput_queue(pQ) )
{
return false;
}
else
{
*pVal = pQ->pBase[pQ->front];
pQ->front = (pQ->front+1) % 6;
return true;
}
}
//显示菜单
void ShowMenu()
{
int i;
int WIDESIZE = 65;
printf("\n\n\n");
printf("------------------------");
printf("\t欢迎使用循环队列的入队和出队\t");
printf("------------------------\n\n");
printf("\t\t");
for(i=0;i<WIDESIZE;i++)
{
printf("*");
}
printf("\n\n");
printf("\t\t*\t1.系统帮助及说明\t**");
printf("\t2.初始化\t\t*\n");
printf("\t\t*\t3.入队\t\t\t");
printf("**\t4.出队\t\t\t*\n");
printf("\t\t*\t5.遍历\t\t\t**");
printf("\t6.退出\t\t\t*\n");
for(i=0;i<4;i++)
{
printf("\t");
}
printf("\n\t\t");
for(i=0;i<WIDESIZE;i++)
{
printf("*");
}
printf("\n");
printf("--------------------------------");
printf(" 2019级电科一班王亚威作品 ");
printf("----------------------------------\n");
printf("\n\n请按所需输入菜单编号:");
}
//显示帮助信息
void ShowHelp()
{
printf("1、此系统可以简单完成循环队列的入队和出队\n");
printf("2、输入对应功能项的编号即可进行不同功能的操作。\n");
}
int main(void)
{
QUEUE Q;
int val;
int flag = -1;
int choice;
while(flag!=6)
{
ShowMenu();
scanf("%d",&choice);
switch (choice)
{
case 1:
ShowHelp();break;
case 2:
init(&Q);break;
case 3:
printf("请输入要入队的元素\n");
scanf("%d",&val);
en_queue(&Q, val);
traverse_queue(&Q);break;
case 4:
if ( out_queue(&Q, &val) )
{
printf("出队成功,队列出队的元素是: %d\n", val);
}
else
{
printf("出队失败!\n");
}
traverse_queue(&Q);break;
case 5:
traverse_queue(&Q);break;
case 6:
flag=6;break;
}
}
return 0;
}