03---顺序队---20195106023---王亚威.c

/*队列及其基本概念
队列的基本概念
队列(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;
}

 

posted @ 2020-11-30 23:03  张同光  阅读(178)  评论(0编辑  收藏  举报