数据结构实验三(循环队列基本操作)题目和源程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三:循环队列基本操作

一、实验目的

1.熟悉并能实现循环队列的定义和基本操作。

2.了解用队列解决实际应用问题。

二、实验要求

1.进行队列的基本操作时要注意队列“先进先出”的特性。

2.复习关于队列操作的基础知识。

3.编写完整程序完成下面的实验内容并上机运行。

4.整理并上交实验报告。

三、实验内容

1.任意输入队列长度和队列中的元素值,构造一个顺序循环队列,对其进行清空、插入新元素、返回队头元素以及删除队头元素操作。

2.约瑟夫环的实现:设有n个人围坐在圆桌周围,现从某个位置i 上的人开始报数,数到m 的人就站出来。下一个人,即原来的第m+1个位置上的人,又从1开始报数,再是数到m的人站出来。依次重复下去,直到全部的人都站出来,按出列的先后又可得到一个新的序列。由于该问题是由古罗马著名的史学家Josephus提出的问题演变而来,所以通常称为

Josephus 问题。

例如:当n=8,m=4,i=1时,得到的新序列为:

4,8,5,2,1,3,7,6

编写程序选择循环队列作为存储结构模拟整个过程,并依次输出出列的各人的编号。

/*----------------------------------------

* 03_循环队列.cpp -- 循环队列基本操作

* 对循环队列的每个基本操作都用单独的函数来实现

* 水上飘2009年写

----------------------------------------*/

// ds03.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

#include

#include

#define MAXQSIZE 100 //最大队列长度

using namespace std;

typedef struct {

int *base; //初始化的动态分配存储空间

int front; //头指针,若队列不空,指向队列头元素

int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置}SqQueue;

//构造一个空队列

void InitQueue(SqQueue &Q)

{

Q.base = (int *)malloc(MAXQSIZE * sizeof(int));

if(!Q.base) cout << "存储分配失败。" << endl;

Q.front = Q.rear = 0;

}

//插入元素e为新的队尾元素

void InsertEnd(SqQueue &Q, int e)

{

if((Q.rear + 1) % MAXQSIZE == Q.front)

cout << "队列已满。" << endl;

Q.base[Q.rear] = e;

Q.rear = (Q.rear + 1) % MAXQSIZE;

}

//给队列随机赋m个值

void Evaluate(SqQueue &Q, int m)

{

int k;

for(int i = 0; i < m; i++)

{

k = rand() % 100;

InsertEnd(Q,k);

}

}

//返回Q的元素个数,即队列的长度

int QueueLength(SqQueue Q)

{

return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE; }

//清空队列

void ClearQueue(SqQueue &Q)

{

Q.front = Q.rear = 0;

}

//若队列不空,则删除Q的队头元素,并返回其值

int DeleteFront(SqQueue &Q)

{

int e;

if(Q.front == Q.rear)

cout << "队列为空。" << endl;

e = Q.base[Q.front];

Q.front = (Q.front + 1) % MAXQSIZE;

return e;

}

//输出循环队列

void OutPut(SqQueue &Q)

{

if(Q.front == Q.rear)

cout << "队列为空。" << endl;

int k;

k = Q.front;

while(k != Q.rear)

{

if(k % 5 == 0)

cout << endl;

cout << setw(5) << Q.base[k];

k++;

}

cout << endl;

}

void Josephus(SqQueue &Q, int m, int n)

{

int p,k,j = 1;

for(int i = 1; i <= n; i++) //给队列中的人依次赋序号

InsertEnd(Q,i);

p = Q.front; //第一个元素位置

while(Q.front != Q.rear)

{

for(int i = 1; i < m; i++)

{

//移动m-1次

if(p == Q.rear) //保证Q.base[p]中有值

p = Q.front;

p++;

if(p == Q.rear)

p = Q.front;

}

cout << setw(5) << Q.base[p];

if(j % 5 == 0)

cout << endl;

j++;

k = p;

if((k+1) == Q.rear) //删除Q.base[p]中的值

{

Q.rear = (MAXQSIZE + (Q.rear-1)) % MAXQSIZE;

continue;

}

else

while((k+1) < Q.rear) //Q.base[p]之后的值依次往前移

{

Q.base[k] = Q.base[k+1];

k++;

}

Q.rear = (MAXQSIZE + (Q.rear-1)) % MAXQSIZE;

}

cout << endl;

}

相关文档
最新文档