数据结构实验4:C++实现循环队列

实验4

4.1 实验目的

熟练掌握队列的顺序存储结构和链式存储结构。

熟练掌握队列的有关算法设计,并在循环顺序队列和链队列上实现。

根据具体给定的需求,合理设计并实现相关结构和算法。

4.2 实验要求

4.2.1 循环顺序队列的实验要求

循环顺序队列结构和运算定义,算法的实现以库文件方式实现,不得在测试主程序中直接实现;

实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求;

程序有适当的注释。

4.3 实验任务

4.3.1 循环顺序队列实验任务

编写算法实现下列问题的求解。

<1>初始化一个队列。

<2>判断是否队空。

<3>判断是否队满。

设队列最大长度:MaxLen=100

第一组数据:入队n个元素,判断队满

第二组数据:用循环方式将1到99,99个元素入队,判队满

<4>入队

第一组数据:4,7,8,12,20,50

第二组数据:a,b,c,d,f,g

<5>出队

<6>取队头元素

<7>求当前队列中元素个数

<8>编写算法实现

①初始化空循环队列;

②当键盘输入奇数时,此奇数入队;

③当键盘输入偶数时,队头出队;

④当键盘输入0时,算法退出;

⑤每当键盘输入后,输出当前队列中的所有元素。

4.5 运行结果截图及说明

图1 测试(1)、(2)、(3)、(5)、(6)、(7)

图2 测试(4)

图3 测试(4)

图4 测试(8)

4.6 附源代码

 1 // stdafx.h : include file for standard system include files,
 2 //  or project specific include files that are used frequently, but
 3 //      are changed infrequently
 4 //
 5
 6 #if !defined(AFX_STDAFX_H__8FA49CDF_FC99_4984_AB37_46921F7ED357__INCLUDED_)
 7 #define AFX_STDAFX_H__8FA49CDF_FC99_4984_AB37_46921F7ED357__INCLUDED_
 8
 9 #if _MSC_VER > 1000
10 #pragma once
11 #endif // _MSC_VER > 1000
12
13 #include <stdc++.h>
14
15 using namespace std;
16
17 typedef int elementType;
18 typedef char elementType1;
19 const int maxn = 100;
20
21 // TODO: reference additional headers your program requires here
22
23 //{{AFX_INSERT_LOCATION}}
24 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
25
26 #endif // !defined(AFX_STDAFX_H__8FA49CDF_FC99_4984_AB37_46921F7ED357__INCLUDED_)
 1 // _SeqCircleQueue.h: interface for the _SeqCircleQueue class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4
 5 #if !defined(AFX__SEQCIRCLEQUEUE_H__FCBC0603_27E1_4352_833C_6BED9B418B96__INCLUDED_)
 6 #define AFX__SEQCIRCLEQUEUE_H__FCBC0603_27E1_4352_833C_6BED9B418B96__INCLUDED_
 7
 8 #if _MSC_VER > 1000
 9 #pragma once
10 #endif // _MSC_VER > 1000
11
12 class _SeqCircleQueue
13 {
14 public:
15     _SeqCircleQueue();
16     virtual ~_SeqCircleQueue();
17     bool emptySeqCircleQueue();
18     bool fullSeqCircleQueue();
19     bool enQueue( elementType value );
20     bool deQueue( elementType &value );
21     bool getFront( elementType &value );
22     int length();
23     void oddOrEven( elementType value );
24     friend ostream &operator<<( ostream &os, _SeqCircleQueue &scq )
25     {
26         if( ( scq._front - 1 ) % maxn == scq._rear )
27             return os;
28         int column  = 0;
29         for( int i = scq._front; i % maxn != scq._rear; i = ( i + 1 ) % maxn )
30         {
31             os << setw(3) << setiosflags(ios::left) << scq.data[i] << " ";
32             column ++;
33             if( column % 10 == 0 )
34                 os << endl;
35         }
36         os << endl;
37     }
38 private:
39     elementType data[maxn];
40     int _front;
41     int _rear;
42
43 };
44
45 #endif // !defined(AFX__SEQCIRCLEQUEUE_H__FCBC0603_27E1_4352_833C_6BED9B418B96__INCLUDED_)
 1 // _SeqCircleQueue.cpp: implementation of the _SeqCircleQueue class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4
 5 #include "stdafx.h"
 6 #include "_SeqCircleQueue.h"
 7
 8 //////////////////////////////////////////////////////////////////////
 9 // Construction/Destruction
10 //////////////////////////////////////////////////////////////////////
11
12 _SeqCircleQueue::_SeqCircleQueue()
13 {
14     _front = _rear = 0;
15 }
16
17 _SeqCircleQueue::~_SeqCircleQueue()
18 {
19     ios::sync_with_stdio(false);
20     cout << "The _SeqCircleQueue destruction has been called!" << endl;
21 }
22
23 bool _SeqCircleQueue::emptySeqCircleQueue()
24 {
25     return _front == _rear;
26 }
27
28 bool _SeqCircleQueue::fullSeqCircleQueue()
29 {
30     return ( _rear + 1 ) % maxn == _front;
31 }
32
33 bool _SeqCircleQueue::enQueue( elementType value )
34 {
35     if( fullSeqCircleQueue() )
36     {
37         cerr << "Seq-Circle-Queue is full!Error in _SeqCircleQueue::enQueue()!" << endl;
38         return false;
39     }
40     data[_rear] = value;
41     _rear = ( _rear + 1 ) % maxn;
42     return true;
43 }
44
45 bool _SeqCircleQueue::deQueue( elementType &value )
46 {
47     if( emptySeqCircleQueue() )
48     {
49         cerr << "Seq-Circle-Queue is empty!Error in _SeqCircleQueue::popFront()!" << endl;
50         return false;
51     }
52     value = data[_front];
53     _front = ( _front + 1 ) % maxn;
54     return true;
55 }
56
57 bool _SeqCircleQueue::getFront( elementType &value )
58 {
59     if( emptySeqCircleQueue() )
60     {
61         cerr << "Seq-Circle-Queue is empty!Error in _SeqCircleQueue::getFront()!" << endl;
62         return false;
63     }
64     value = data[_front];
65     return true;
66 }
67
68 int _SeqCircleQueue::length()
69 {
70     if( emptySeqCircleQueue() )
71     {
72         cerr << "Seq-Circle-Queue is empty!Error in _SeqCircleQueue::length()!" << endl;
73         return -1;
74     }
75     return ( _rear - _front + maxn ) % maxn;
76 }
77
78 void _SeqCircleQueue::oddOrEven( elementType value )
79 {
80     if( value & 1 )
81     {
82         enQueue(value);
83         cout << value << " will be added to the queue!" << endl;
84         cout << (*this);
85     }
86     else if( !( value & 1) && value != 0 )
87     {
88         elementType x;
89         deQueue(x);
90         cout << x << " has been deleted from the queue!" << endl;
91         cout << (*this);
92     }
93     else //if( value == 0 )
94     {
95         cout << "The _SeqCircleQueue::oddOrEven() has been stoped!" << endl;
96         return;
97     }
98 }
 1 // charSeqCircleQueue.h: interface for the charSeqCircleQueue class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4
 5 #if !defined(AFX_CHARSEQCIRCLEQUEUE_H__FBB4F8DD_2EF9_43A6_8E23_FD7E4C56908E__INCLUDED_)
 6 #define AFX_CHARSEQCIRCLEQUEUE_H__FBB4F8DD_2EF9_43A6_8E23_FD7E4C56908E__INCLUDED_
 7
 8 #if _MSC_VER > 1000
 9 #pragma once
10 #endif // _MSC_VER > 1000
11
12 class charSeqCircleQueue
13 {
14 public:
15     charSeqCircleQueue();
16     virtual ~charSeqCircleQueue();
17     bool emptyCharSeqCircleQueue();
18     bool fullCharSeqCircleQueue();
19     bool enQueue( elementType1 value );
20     bool deQueue( elementType1 &value );
21     bool getFront( elementType1 &value );
22     int length();
23     friend ostream &operator<<( ostream &os, charSeqCircleQueue &cscq )
24     {
25         if( ( cscq._front - 1 ) % maxn == cscq._rear )
26             return os;
27         int column  = 0;
28         for( int i = cscq._front; i % maxn != cscq._rear; i = ( i + 1 ) % maxn )
29         {
30             os << setw(3) << setiosflags(ios::left) << cscq.data[i] << " ";
31             column ++;
32             if( column % 10 == 0 )
33                 os << endl;
34         }
35         os << endl;
36     }
37 private:
38     elementType1 data[maxn];
39     int _front;
40     int _rear;
41
42 };
43
44 #endif // !defined(AFX_CHARSEQCIRCLEQUEUE_H__FBB4F8DD_2EF9_43A6_8E23_FD7E4C56908E__INCLUDED_)
 1 // charSeqCircleQueue.cpp: implementation of the charSeqCircleQueue class.
 2 //
 3 //////////////////////////////////////////////////////////////////////
 4
 5 #include "stdafx.h"
 6 #include "charSeqCircleQueue.h"
 7
 8 //////////////////////////////////////////////////////////////////////
 9 // Construction/Destruction
10 //////////////////////////////////////////////////////////////////////
11
12 charSeqCircleQueue::charSeqCircleQueue()
13 {
14     _front = _rear = 0;
15 }
16
17 charSeqCircleQueue::~charSeqCircleQueue()
18 {
19     ios::sync_with_stdio(false);
20     cout << "The charSeqCircleQueue destruction has been called!" << endl;
21 }
22
23 bool charSeqCircleQueue::emptyCharSeqCircleQueue()
24 {
25     return _front == _rear;
26 }
27
28 bool charSeqCircleQueue::fullCharSeqCircleQueue()
29 {
30     return ( _rear + 1 ) % maxn == _front;
31 }
32
33 bool charSeqCircleQueue::enQueue( elementType1 value )
34 {
35     if( fullCharSeqCircleQueue() )
36     {
37         cerr << "Seq-Circle-Queue is full!Error in charSeqCircleQueue::::enQueue()!" << endl;
38         return false;
39     }
40     data[_rear] = value;
41     _rear = ( _rear + 1 ) % maxn;
42     return true;
43 }
44
45 bool charSeqCircleQueue::deQueue( elementType1 &value )
46 {
47     if( emptyCharSeqCircleQueue() )
48     {
49         cerr << "Seq-Circle-Queue is empty!Error in charSeqCircleQueue::popFront()!" << endl;
50         return false;
51     }
52     value = data[_front];
53     _front = ( _front + 1 ) % maxn;
54     return true;
55 }
56
57 bool charSeqCircleQueue::getFront( elementType1 &value )
58 {
59     if( emptyCharSeqCircleQueue() )
60     {
61         cerr << "Seq-Circle-Queue is empty!Error in charSeqCircleQueue::::getFront()!" << endl;
62         return false;
63     }
64     value = data[_front];
65     return true;
66 }
67
68 int charSeqCircleQueue::length()
69 {
70     if( emptyCharSeqCircleQueue() )
71     {
72         cerr << "Seq-Circle-Queue is empty!Error in charSeqCircleQueue::::length()!" << endl;
73         return -1;
74     }
75     return ( _rear - _front + maxn ) % maxn;
76 }

4.7 调试过程中出现的bug总结

注意细节!

原文地址:https://www.cnblogs.com/25th-engineer/p/9940885.html

时间: 2024-07-31 22:23:58

数据结构实验4:C++实现循环队列的相关文章

数据结构实验三《栈和队列》

<数据结构>实验三 栈和队列 一.实验目的 巩固栈和队列数据结构,学会运用栈和队列. 1.回顾栈和队列的逻辑结构和受限操作特点,栈和队列的物理存储结构和常见操作. 2.学习运用栈和队列的知识来解决实际问题. 3.进一步巩固程序调试方法. 4.进一步巩固模板程序设计. 二.实验时间 准备时间为第5周到第6周,具体集中实验时间为6周第2次课.2个学时. 三.实验内容 1.自己选择顺序或链式存储结构,定义一个空栈类,并定义入栈.出栈.取栈元素基本操作.然后在主程序中对给定的N个数据进行验证,输出各个

数据结构之---C语言实现循环队列

//循环队列 //杨鑫 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 typedef int QElemType; typedef struct queue { QElemType elem[MAXSIZE]; int front; int rear; }SqQueue; //定义队头 int init_Queue(SqQueue **q) //初始化 { (*q)->front = 0; (*q)->

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

数据结构6_顺序队列(循环队列)

本文实现了顺序队列,与链队列不同的是,顺序队列需要考虑一个问题, 问题情况如下, 解决办法:循环队列,当rear到分配的数组空间末尾时,转到数组头 但是当q.rear==q.front时,又如何区分一种是空队列,一种是满队列的情况呢 这里有两种方案 本次代码实现了第一种方法,同时设置了一个技术变量length,稍加改动便可实现第二个方法 代码如下: #include<iostream>using namespace std;//该顺序队列为循环队列,解决队尾指针达到最大值,队列中有空闲单元,但

数据结构——队列及循环队列

说明:严蔚敏的<数据结构>(C语言版)学习笔记,记录一下,以备后面查看. #include <stdio.h> #include <stdlib.h> #define OK 1; #define ERROR -1; typedef int QElemType; typedef int Status; //定义队列节点 typedef struct QNode{ QElemType data; struct QNode *next; }QNode, *QueuePtr;

数据结构算法C语言实现(十二)--- 3.4循环队列&amp;队列的顺序表示和实现

一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 1 //3_4_part1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-9 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 64 9 #include <cstdio

数据结构实验之队列一:排队买饭

数据结构实验之队列一:排队买饭 题目描写叙述 中午买饭的人特多,食堂真是太拥挤了,买个饭费劲,理工大的小孩还是非常聪明的,直接奔政通超市,哈哈,确实,政通超市里面也卖饭,有好几种菜,做的比食堂好吃多了,价格也不比食堂贵,而且买菜就送豆浆,吸引了不少童鞋.所以有时吧,人还是非常多的,排队是免不了的,悲剧的是超市仅仅有两个收银窗体. 问题是这种:開始有两队人在排队,如今咱们仅仅研究第一队.如今我们给每一个人一个编号,保证编号各不同样,排在前面的人买完饭就走了,有些人挑完饭就排在后面等待付款.还有一些

基本数据结构,循环队列的顺序实现。

队列是一种先进先出的数据结构,这里用顺序结构将其实现. 1.首先用结构体定义一个队列,front指向队首元素的前面一位,real指向队尾元素. 1 //队列的结构定义 2 #define MAX 6 3 typedef struct { 4 int front,real; 5 int data[MAX]; 6 }queue; 2.创建一个循环队列,初始化令front=real=0,因为当队列满时也有front=real,此时无法判断队满:所以我们弃置一个元素位不用,其位置随机,所以队列的实际最大

大话数据结构----循环队列和链式队列

队列(Queue) 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表 队列的特点就是:先进先出,和生活中排队的例子是很先进的,排队的目的不就是先到先得吗. 生活中的队列相当于顺序存储的队列,在火车站排队买票,前面的人买完票走了,后面的人一个一个往前移一位,这是很正常的事情,而计算机中队列队列第一个元素出去了,后面的元素一个一个往前移,这是一件很降低效率的一件事.为了解决这种效率问题,计算机采用循环队列的方式操作队数据. 循环队列 队列的头尾相接的顺序存储结构称为循环队列. 1.首先循环