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