顺序队列及链队列的基本操作实现

本文介绍了通过实现循环队列和链队列来解决实际问题的过程。包括队列的入队、出队操作,以及如何判断队列是否为空或已满。通过具体代码示例展示了两种队列的不同特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验目的

1、熟练队列的结构特点,掌握队列的顺序存储和链式存储结构和实现。

2、 学会使用队列解决实际问题。

二、实验内容

自己确定结点的具体数据类型和问题规模:

分别建立一个顺序队列和链队列,实现队列的入队和出队操作。

三、实验步骤

1、依据实验内容分别说明实验程序中用到的数据类型的定义;

2、相关操作的算法表达;

3、完整程序;

4、总结、运行结果和分析。

5、总体收获和不足,疑问等。

四、实验代码

1、顺序队列

 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
      
#include<iostream>
using namespace std ;

const int QueueSize = 100 ;
class CirQueue
{
public:
CirQueue (); //{front=rear=QueueSize-1;}
~ CirQueue (){}
void EnQueue ( int x );
int DeQueue ();
int GetQueue ();
int Empty ();
private:
int data [ QueueSize ];
int front , rear ;
};
//循环队列入队EnQueue函数

void CirQueue :: EnQueue ( int x )
{
if (( rear + 1 ) % QueueSize == front ) throw "上溢" ;
rear = ( rear + 1 ) % QueueSize ; //队尾指针在循环意义下加1
data [ rear ] = x ; //在队尾处加入元素
}
//循环队列出队DeQueue函数
int CirQueue :: DeQueue ()
{
if ( rear == front ) throw "下溢" ;
front = ( front + 1 ) % QueueSize ; //队头指针在循环意义下加1
return data [ front ]; //读取并返回出队前的队头元素
}
//读取队头元素GetQueue函数
int CirQueue :: GetQueue ()
{
if ( rear == front ) throw "下溢" ;
int i = ( front + 1 ) % QueueSize ;
return data [ i ];
}
//构造函数
CirQueue :: CirQueue ()
{
front = rear = QueueSize - 1 ;
}
int CirQueue :: Empty ()
{
if ( front == rear )
return 1 ;
else
return 0 ;
}
void main ()
{
CirQueue q ;
if ( q . Empty ())
cout << "队列为空" << " \n " << endl ;
else
cout << "队列非空" << " \n " << endl ;
cout << "元素88和99执行入队操作" << " \n " << endl ;
try
{
q . EnQueue ( 88 );
q . EnQueue ( 99 );
}
catch ( char * wrong )
{
cout << wrong << " \n " << endl ;
}
cout << "查看队头元素" << " \n " << endl ;
cout << q . GetQueue () << " \n " << endl ;
cout << "执行出队操作" << " \n " << endl ;
try
{
q . DeQueue ();
}
catch ( char * wrong )
{
cout << wrong << " \n " << endl ;
}
cout << "查看队头元素" << " \n " << endl ;
cout << q . GetQueue () << " \n " << endl ;
}
2、链队列

1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
      
#include<iostream>
using namespace std ;

struct Node
{
int data ;
Node * next ;
};

class LinkQueue
{
public:
LinkQueue ();
~ LinkQueue (); //析构函数,释放链队列中各结点的存储空间
void EnQueue ( int x ); //将元素x入队
int DeQueue (); //将队头元素出队
int GetQueue (); //取链队列的队头元素
int Empty ();
private:
Node * front , * rear ; //队头和队尾元素
};

LinkQueue :: LinkQueue ()
{
Node * s = NULL ;
s = new Node ;
s -> next = NULL ;
front = rear = s ;
}

LinkQueue ::~ LinkQueue ()
{
Node * p = NULL ;
while ( front != NULL )
{
p = front -> next ;
delete front ;
front = p ;
}
}

void LinkQueue :: EnQueue ( int x )
{
Node * s = NULL ;
s = new Node ;
s -> data = x ;
s -> next = NULL ;
rear -> next = s ; rear = s ; //将结点s插入到队尾
}
int LinkQueue :: DeQueue ()
{
Node * p = NULL ;
int x ;
if ( rear == front ) throw "下溢" ;
p = front -> next ;
x = p -> data ;
front -> next = p -> next ;
if ( p -> next == NULL ) rear = front ;
delete p ;
return x ;
}

int LinkQueue :: GetQueue ()
{
int p ;
if ( front != rear )
p = front -> next -> data ;
return p ;
}

int LinkQueue :: Empty ()
{
if ( front == rear )
{
return 1 ;
}
else
{
return 0 ;
}
}
void main ()
{
LinkQueue q ;
if ( q . Empty ())
cout << "队列为空" << " \n " << endl ;
else
cout << "队列非空" << " \n " << endl ;
cout << "元素88和99执行入队操作" << " \n " << endl ;
try
{
q . EnQueue ( 88 );
q . EnQueue ( 99 );
}
catch ( char * wrong )
{
cout << wrong << " \n " << endl ;
}
cout << "查看队头元素:" << " \n " << endl ;
cout << q . GetQueue () << " \n " << endl ;
cout << "执行出队操作:" << " \n " << endl ;
try
{
q . DeQueue ();
}
catch ( char * wrong )
{
cout << wrong << " \n " << endl ;
}
cout << "查看队头元素:" << " \n " << endl ;
cout << q . GetQueue () << " \n " << endl ;
}
五、实验运行结果
1、顺序队列(循环队列)


2、链队列



六、实验总结及心得

1、总结

(1)实现循环队列和链队列的基本操作的算法都需要常数时间O(1)。

(2)本次实验顺序队列主要解决了“假溢出”和“队空和队满”的问题,解决假溢出的方法是:把存储队列的数组看成是头尾相接的循环结构,即允许队列直接从数组中下标最大的位置延续到下标最小的位置。队列的这种头尾相接的顺序存储结构称为循环队列。判断队满的条件是:(rear+1)%QueueSize=front。

2、心得

熟悉了队列的假溢出操作,但对队满的算法还存在一些疑惑,需要在日后的实验中好好体会,争取以后不看书本也能调试出合理的代码。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值