数据结构:实验二 队列的基本功能实现

实验二 队列的基本功能实现

一、实验目的

1、掌握用 VC上机调试队列的基本方法;
2、掌握队列的基本操作,以顺序表示、链式表示两种存储方式实现队列的建立、插入、删除算法。

二、实验环境

1、PC微机;
2、Windows 操作系统;
3、VC6.0或以上

三、实验内容

在队列的顺序表示和链式表示两种方式中选择一种存储方式,实现队列的创建、插入、删除算法;编写程序、定义相应的变量,上机调式实现本次实验内容。

四、实验步骤、测试及结果

1.代码

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

#define ERROR  0
#define OK     1
#define TRUE   1
#define FALSE  0
#define QUEUESIZE 10

typedef int Status;
typedef int QElemtype;

typedef struct QNode{
	QElemtype *base;
	int front;
	int rear;
}SqQueue;

//初始化
void InitQueue(SqQueue *Q)
{
	Q->base=(QElemtype*)malloc(sizeof(QElemtype)*QUEUESIZE);
	assert(Q->base!=NULL);
	Q->front=Q->rear=0; 
}

//入队
Status EnQueue(SqQueue *Q,QElemtype e)
{
	if(Q->rear==QUEUESIZE)
	{
		return ERROR;
	}
	Q->base[Q->rear]=e;
	Q->rear++;
	return OK;
}

//判断是否为空
Status QueueEmpty(SqQueue *Q)
{
	if(Q->front==Q->rear)
	{
		return TRUE;
	}
	return FALSE;
}

//求长度
Status QueueLength(SqQueue Q)
{
	return Q.rear-Q.front;
}

//获取队头元素
Status GetHead(SqQueue *Q,QElemtype *e)
{
	if(Q->front==Q->rear)
	{
		return ERROR;
	}
	*e=Q->base[Q->front];
	return OK;
}

//销毁
void DestoryQueue(SqQueue *Q)
{
	if(Q->base)      //队列Q存在 
	{
		free(Q->base);
	}
	Q->base=NULL;
	Q->front=Q->rear=0;
}

//清空

void ClearQueue(SqQueue *Q)
{
	Q->front=Q->rear=0;
}

//出队
Status DeQueue(SqQueue *Q,QElemtype *e)
{
	if(Q->front==Q->rear)
	{
		return ERROR;
	}
	*e=Q->base[Q->front];
	Q->front++;
	return OK;
}

//遍历
void QueueTraverse(SqQueue Q,void(*visit)(QElemtype))
{
	int i=Q.front;
	while(i!=Q.rear)
	{
		visit(Q.base[i]);
		i++;
	}
	printf("\n");
} 
void Print(QElemtype e)
{
	printf("%d ",e);
}
//主函数
int main()
{
	QElemtype i,e,d;
	SqQueue Q;
	InitQueue(&Q);
	printf("请输入队列的%d个元素:\n",QUEUESIZE);
	for(i=0;i<QUEUESIZE;i++)
	{
		scanf("%d",&d);
		EnQueue(&Q,d);
	}
	printf("队列的元素为:");
	QueueTraverse(Q,Print);
	printf("队列长度为:%d\n",QueueLength(Q));
	int k=QueueLength(Q);
	printf("连续%d次由对头删除元素,队尾插入元素:\n",k/2);
	for(i=0;i<k/2;i++)
	{
		DeQueue(&Q,&e);
		printf("删除的队列的元素是:%d,请输入插入的元素:",e);
		scanf("%d",&d);
		EnQueue(&Q,d);
	}
	printf("新的队列元素为:\n");
	QueueTraverse(Q,Print);
	
	int n=GetHead(&Q,&e);
	if(n)printf("对头元素为:%d\n",e);
	else {
		printf("队空!\n");	return -1;
	}
	ClearQueue(&Q);
	printf("清空队列后队列是否为空:%d\t(1:为空 ,0:不为空)\n",QueueEmpty(&Q));
	DestoryQueue(&Q);
	printf("销毁队列后:\nQ.base=%u\tQ.front=%d\tQ.rear=%d\t\n",Q.base,Q.front,Q.rear);
	return 0; 
}

  1. 运行结果
    在这里插入图片描述

五、实验小结

1.队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的端是队尾,允许删除的端是队头。
2. 顺序存储就是用数组实现,比如有一个n个元素的队列,数组下标0的一端是队头,入队操作就是通过数组下标一个个顺序追加,不需要移动元素,但是如果删除队头元素,后面的元素就要往前移动,对应的时间复杂度就是O(n)。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第一次实验: 题目1 单链表相关算法的实验验证。 [实验目的] 验证单链表及其上的基本操作。 [实验内容及要求] 1、 定义单链表类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)创建单链表; 2)插入操作:分别在当前结点后、表头、表尾插入值为x的结点; 3)删除操作:分别删除表头结点、表尾结点和当前结点的后继结点; 4)存取操作:分别存取当前结点的值和单链表中第k个结点的值; 5)查找操作:查找值为x的元素在单链表中的位置(下标)。 题目2 分别给出堆栈、队列相关算法的实验验证。 [实验目的] 验证堆栈、队列及其上的基本操作。 [实验内容及要求](以队列为例) 1、 定义队列类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)创建队列; 2)插入操作:向队尾插入值为x的元素; 3)删除操作:删除队首元素; 4)存取操作:读取队首元素。 第实验 题目1 叉树相关算法的实验验证。 [实验目的] 验证叉树的链接存储结构及其上的基本操作。 [实验内容及要求] 1、 定义链接存储的叉树类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)创建一棵叉树,并对其初始化; 2)先根、中根、后根遍历叉树(递归算法); 3)在叉树中搜索给定结点的父结点; 4)搜索叉树中符合数据域条件的结点; 5)从叉树中删除给定结点及其左右子树。 题目2 树和森林的遍历算法的实验验证。 [实验目的] 验证树和森林的遍历算法。 [实验内容及要求] 1、 定义左儿子—右兄弟链接存储的树类和森林类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)创建树和森林; 2)树和森林的先根遍历的递归和迭代算法; 3)树和森林的后根遍历的递归和迭代算法; 4)树和森林的层次遍历算法。 题目3 叉查找树的验证实验。 [实验目的] 验证叉查找树及其相关操作。 [实验内容及要求] 1、 定义叉查找树的类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)实现叉查找树结构; 2) 实现叉查找树的查找、插入和删除等算法; 第三次实验 题目1 邻接表存储的图相关算法的实验验证。 [实验目的] 验证邻接表存的图及其上的基本操作。 [实验内容及要求] 1、 定义邻接表存储的图类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)创建一个邻接表存储的图; 2)返回图中指定边的权值; 3)返回图中某顶点的第一个邻接顶点; 4)返回图中某顶点关于另一个顶点的下一个邻接顶点的序号; 5)插入操作:向图中插入一个顶点,插入一条边; 6)删除操作:从图中删除一个顶点,删除一条边。 题目2 图的遍历算法的实验验证。 [实验目的] 验证图的遍历算法。 [实验内容及要求] 1、 定义邻接表存储的图。 2、 实验验证如下算法的正确性、各种功能及指标: 1)创建一个图; 2)图的深度优先遍历的递归算法; 3)图的深度优先遍历的迭代算法; 4)图的广度优先遍历算法。 第四次实验 折半插入排序,堆排序,快速排序 请阅读说明文档
循环队列是一种特殊的队列,其队尾指针指向数组的末尾时,若队头指针不在数组的开头,则可以将队列的前端空间利用起来,形成一个循环队列。下面是一个循环队列实现代码及基本功能: ```c++ #include<iostream> using namespace std; #define MAXSIZE 5 //定义循环队列数组的大小 class CircleQueue { private: int data[MAXSIZE]; //循环队列数组 int front, rear; //队头和队尾指针 public: CircleQueue() //构造函数,初始化队头和队尾指针 { front = rear = 0; } bool isFull() //判断队列是否已满 { if ((rear + 1) % MAXSIZE == front) return true; return false; } bool isEmpty() //判断队列是否为空 { if (front == rear) return true; return false; } bool enQueue(int x) //入队操作 { if (isFull()) { cout << "队列已满,无法插入元素!" << endl; return false; } data[rear] = x; rear = (rear + 1) % MAXSIZE; return true; } int deQueue() //出队操作 { if (isEmpty()) { cout << "队列为空,无法删除元素!" << endl; return -1; } int x = data[front]; front = (front + 1) % MAXSIZE; return x; } int getFront() //获取队头元素 { if (isEmpty()) { cout << "队列为空,无法获取队头元素!" << endl; return -1; } return data[front]; } int getRear() //获取队尾元素 { if (isEmpty()) { cout << "队列为空,无法获取队尾元素!" << endl; return -1; } return data[(rear - 1 + MAXSIZE) % MAXSIZE]; } }; int main() { CircleQueue q; q.enQueue(1); q.enQueue(2); q.enQueue(3); q.enQueue(4); q.enQueue(5); q.enQueue(6); cout << "队头元素:" << q.getFront() << endl; cout << "队尾元素:" << q.getRear() << endl; q.deQueue(); q.deQueue(); q.deQueue(); cout << "队头元素:" << q.getFront() << endl; cout << "队尾元素:" << q.getRear() << endl; q.enQueue(7); q.enQueue(8); cout << "队头元素:" << q.getFront() << endl; cout << "队尾元素:" << q.getRear() << endl; return 0; } ``` 以上代码实现了循环队列基本功能,包括判断队列是否为空、是否已满、入队、出队、获取队头元素和获取队尾元素。在主函数中,我们通过一些操作来测试循环队列的功能,例如插入元素、删除元素、获取队头元素和队尾元素等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值