数据结构04顺序队20205106009郭睿玥

/*郭睿玥第四次算法实验作业*/


/*实验原理
    循环队列是队列的顺序映像的实现,采用顺序存储结构存储队列,会产生假溢出现象,循环队列
是解决假溢出的很好途径。若队列为空时队头指示器与队尾指示器同时指向某一存储单元,即此时两
个指示器的数值相同,若队列非空,队头指示器指向队头元素下标,队尾指示器指向队尾元素的下一
个位置的下标;
    循环队列进行入队操作时,只需直接把值赋给当前队尾指示器所指向的下标,然后队尾指示器向
后移动一个位置即可;出队操作时若需返回队头结点值,先返回当前队头指示器所指向的下标的值,
让队头指示器向后移动一个位置,否则直接移动位置即可;
*/

/*实验环境
CodeBlocks*/


/*实验目的
掌握循环队列的基本操作,循环队列初始化、入队、出队、判断队空、判断队满以及求队列长度操作;
掌握队列在顺序存储结构上的操作实现。
*/



/*实验内容
循环队列的初始化、入队、出队、判断是否为空、求队列长度及队列输出操作的实现;
通过设计统一界面来调用基本操作的实现。
*/



#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 5
typedef int Status;// 定义函数返回值类型
typedef int ElemType;// 定义每条数据的结构体类型

typedef struct//结构体
{
int front;//队头指针
int rear;//队尾指针
ElemType* base;//base[]为数据
}sqqueue;


Status initsqqueue(sqqueue*q)//队列的初始化
{
    q->base=(ElemType*)malloc(sizeof(ElemType*)*MAXSIZE);//申请空间建立数组
    if(!q->base) return 0;//空间申请是否成功
    q->front=q->rear=0;//空队列标志
    printf("初始化成功\n");
    return 1;//初始化成功返回1
}

Status queueempty(sqqueue *q)//判断是否为空
{
   if(q->front==q->rear) //判空条件
        return 1;
    return 0;
}

Status getlength(sqqueue*q)//统计队列长度
{
    return (q->rear-q->front+MAXSIZE)%MAXSIZE;//模运算出队列长度并返回
}

Status queueefull(sqqueue*q)//判断是否为满
{
   if((q->rear+1)%MAXSIZE==q->front)//如果队满则头指针一定指向尾指针之后的一个结点
    return 1;
    else return 0;
}


Status enqueue(sqqueue*q,ElemType e)//入队操作
{
    if(queueefull(q)) //队满则无法入队
        return 0;
    q->base[q->rear]=e;//新元素入队
    q->rear=(q->rear+1)%MAXSIZE;//尾指针移动
    return 1;
}

Status dequeue(sqqueue*q) //出队操作
{
    ElemType e;
    e=q->base[q->front];
    q->front=(q->front+1)%MAXSIZE;//尾指针移动
    return e;//返回出队的元素
}


void traverse(sqqueue*l)//输出队列
{
    sqqueue *p;/*建立一个新队列与要输出的队列一致*/
    p=l;
    for(;p->front!=p->rear;)//直到新队列成为空队列,每次输出都是新队列的头元素后使新队列出队
    {
        printf("该元素是%d,它位于队列中的第%d个单元\n",p->base[p->front],p->front+1);//输出新队列头元素
        dequeue(p);//对新队列出队
    }
    return 0;
}

int main()
{
    int choice;
    sqqueue QQ;
	do {/*显示操作界面*/
		printf("1. 初始化                                                   \n");
		printf("2. 入队;                                                   \n");
		printf("3. 出队;                                                   \n");
		printf("4. 求队列长度;                                             \n");
		printf("5. 队列判空;                                               \n");
		printf("6. 队列判满;                                               \n");
		printf("7. 输出队列;                                               \n");
		printf("0. 退出。                                                   \n");
		printf("\n");
		printf("请选择你要操作的选项:");
		scanf("%d", &choice);//输入需要进行的选项
		printf("\n");
		switch (choice) {
		case 1:{
			initsqqueue(&QQ);//队列的初始化
				break;
			}
		case 2:{//入队操作
        ElemType i;
        printf("*请输入你要入队的数据                                              *\n");
        scanf("%d",&i);
        if(enqueue(&QQ,i))
            printf("入队成功\n");
          else  printf("入队失败\n");
				break;
			}
		case 3:{//出队操作
        if(queueempty(&QQ)) {
                 printf("空队,无法出队\n");//空队列无法出队
                 break;
            }
        if(dequeue(&QQ))printf("出队成功\n");//出队操作
				break;
			}
		case 4:{
		printf("该队列的长度是%d\n",getlength(&QQ));//求队列长度并输出
				break;
			}
		case 5:{
		if 	(queueempty(&QQ)) printf("空栈\n");//判空
		    else printf("不是空栈\n");
				break;
			}
		case 6:{
		if 	(queueefull(&QQ)) printf("满栈\n");//判满
		    else printf("不是满栈\n");
				break;
			}
        case 7:{
        traverse(&QQ);//输出队列
				break;
			}
		case 0:{
				printf("\n退出系统成功!请按任意键结束!\n");//退出程序
				exit(0);
			}
			break;
		}
	} while (choice);//只要选择不为需要进行的功能不为0则该程序可以一直进行下去
    return 0;
}

/*
实验结果

操作界面如下

1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。
郭睿玥 算法与数据结构第四次作业

1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:1

初始化成功
1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:2

*请输入你要入队的数据                                              *
6
入队成功
1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:2

*请输入你要入队的数据                                              *
8
入队成功
1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:2

*请输入你要入队的数据                                              *
4
入队成功
1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:2

*请输入你要入队的数据                                              *
9
入队成功
1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:2

*请输入你要入队的数据                                              *
2
入队失败
1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:3

出队成功
1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:4

该队列的长度是3
1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:5

不是空栈
1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:6

不是满栈
1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:7

该元素是8,它位于队列中的第2个单元
该元素是4,它位于队列中的第3个单元
该元素是9,它位于队列中的第4个单元
1. 初始化
2. 入队;
3. 出队;
4. 求队列长度;
5. 队列判空;
6. 队列判满;
7. 输出队列;
0. 退出。

请选择你要操作的选项:0

退出系统成功!
*/
原文地址:https://www.cnblogs.com/ztguang/p/15731635.html