当前位置:   article > 正文

数据结构 实验五 队列的算法实现及应用_算法实现和应用的实验过程

算法实现和应用的实验过程

实验项目名称:队列的算法实现及应用

实验目的:熟悉队列的逻辑特性、存储表示方法和队列基本操作及应用。

实验要求:了解并熟悉队列的逻辑特性、顺序和链式存储表示方法和队列的基本操作的实现和应用。

实验内容

编写程序实现下列的要求:

(1)编写程序,用不同的存储方法,实现队列的基本操作。

循环队列(顺序):

  1. #include<iostream>
  2. using namespace std;
  3. //循环队列(顺序)
  4. const int QueueSize = 100; //100是示例性数据
  5. class CirQueue
  6. {
  7. public:
  8. CirQueue(); //构造函数,初始化空队列
  9. ~CirQueue(); //析构函数
  10. void EnQueue(int x); //入队操作,将元素x入队
  11. int DeQueue(); //出队操作,将队头元素出队
  12. int GetHead(); //取队头元元素(并不删除)
  13. int Empty(); //判断队列是否为空
  14. private:
  15. int data[QueueSize]; //存放队列元素的数组
  16. int front, rear; //游标,对头和队尾指针
  17. };
  18. CirQueue::CirQueue() //循环队列构造函数
  19. {
  20. rear = front = QueueSize - 1;
  21. }
  22. CirQueue::~CirQueue() //循环队列的析构函数
  23. {
  24. }
  25. void CirQueue::EnQueue(int x) //循环队列的入队操作
  26. {
  27. if((rear + 1) % QueueSize == front)throw"上溢";
  28. rear = (rear + 1) % QueueSize; //队尾指针在循环意义下加1
  29. data[rear] = x; //在队尾处插入元素
  30. }
  31. int CirQueue::DeQueue() //出队操作
  32. {
  33. if(rear == front)
  34. throw"下溢";
  35. front = (front + 1) % QueueSize; //队头在循环意义下加1
  36. return data[front]; //返回出队前的队头元素
  37. }
  38. int CirQueue::GetHead() //取队头元素
  39. {
  40. if(rear == front) throw"下溢";
  41. return data[(front + 1) % QueueSize]; //注意不修改队头指针
  42. }
  43. int CirQueue::Empty() //判空操作
  44. {
  45. if(rear == front)
  46. cout << "当前队列为空" << endl;
  47. else
  48. cout << "当前队列非空" << endl;
  49. }
  50. int main() {
  51. int n, x;
  52. cout << "请输入队列长度";
  53. cin >> n;
  54. CirQueue q; //定义对象变量Q
  55. cout << "请依次输入入队元素:" << endl;
  56. for(int i = 0; i < n; i++) {
  57. int t;
  58. cin >> t;
  59. q.EnQueue(t);
  60. }
  61. q.Empty();
  62. cout << "请输入入队元素:";
  63. cin >> x;
  64. q.EnQueue(x);
  65. cout << "执行一次出队操作,出队元素是:" << q.DeQueue() << endl;
  66. q.DeQueue();
  67. }

链式:

  1. #include <iostream>
  2. using namespace std;
  3. //链队列
  4. struct Node
  5. {
  6. int data; //数据域
  7. Node *next; //指针域
  8. };
  9. class LinkQueue
  10. {
  11. public:
  12. LinkQueue( ); //构造函数,初始化一个空的链队列
  13. ~LinkQueue( ); //析构函数,释放链队列各结点的存储空间
  14. void EnQueue(int x); //入队操作,将元素x入队
  15. int DeQueue( ); //出队操作,将队头元素出队
  16. int GetQueue( ); //取链队列的队头元素
  17. int Empty( ); //判断链队列是否为空
  18. void PrintQueue( ); //遍历链队列操作
  19. private:
  20. Node *front, *rear; //队头和队尾指针,分别指向头结点和终端结点
  21. };
  22. LinkQueue :: LinkQueue( ) //构造函数,初始化一个空的链队列
  23. {
  24. Node *s = NULL;
  25. s = new Node; s->next = NULL; //创建头结点s
  26. front = rear = s; //将队头指针和队尾指针都指向头结点s
  27. }
  28. LinkQueue :: ~LinkQueue() //析构函数,释放链队列各结点的存储空间
  29. {
  30. Node *q = NULL;
  31. while (front != NULL) //释放单链表的每一个结点的存储空间
  32. {
  33. q = front; //暂存被释放结点
  34. front = front->next; // front指向被释放结点的下一个结点
  35. delete q;
  36. }
  37. }
  38. void LinkQueue :: EnQueue(int x) //入队操作,将元素x入队
  39. {
  40. Node *s = NULL;
  41. s = new Node; //申请结点s
  42. s->data = x; s->next = NULL;
  43. rear->next = s; rear = s; //将结点s插入到队尾
  44. }
  45. int LinkQueue :: DeQueue( ) //出队操作,将队头元素出队
  46. {
  47. int x;
  48. Node *p = NULL;
  49. if (rear == front) throw "下溢";
  50. p = front->next; x = p->data; //暂存队头元素
  51. front->next = p->next; //将队头元素所在结点摘链
  52. if (p->next == NULL) rear = front; //判断出队前队列长度是否为1
  53. delete p;
  54. return x;
  55. }
  56. int LinkQueue :: GetQueue() //取链队列的队头元素
  57. {
  58. if(front == rear)
  59. throw "下溢异常";
  60. else
  61. return front->next->data;
  62. }
  63. int LinkQueue :: Empty() //判断链队列是否为空
  64. {
  65. if(front == rear)
  66. cout << "当前队列:为空" << endl;
  67. else
  68. cout << "当前队列:非空" << endl;
  69. }
  70. void LinkQueue::PrintQueue() //遍历链队列操作
  71. {
  72. Node *p = front->next; //工作指针p初始化
  73. while(p != NULL) {
  74. cout << p->data << " ";
  75. p = p->next; //工作指针p后移,注意不能写作p++
  76. }
  77. cout << endl;
  78. }
  79. int main( )
  80. {
  81. int n, x;
  82. cout << "请输入定义的链队列长度";
  83. cin >> n;
  84. LinkQueue Q; //定义对象变量Q
  85. cout << "请依次输入入队元素:" << endl;
  86. for(int i = 0; i < n; i++)
  87. {
  88. int t;
  89. cin >> t;
  90. Q.EnQueue(t);
  91. }
  92. Q.Empty();
  93. cout << "当前链队列遍历为:" << endl;
  94. Q.PrintQueue();
  95. cout << "当前链队列队头元素为:" << Q.GetQueue( ) << endl; //输出队头元素
  96. cout << "执行一次出队操作,出队元素是:" << Q.DeQueue( ) << endl; //输出出队元素
  97. cout << "请输入入队元素:";
  98. cin >> x;
  99. Q.EnQueue(x);
  100. Q.Empty();
  101. cout << "当前链队列队头元素为:" << Q.GetQueue( ) << endl; //输出队头元素
  102. cout << "当前链队列遍历为:" << endl;
  103. Q.PrintQueue();
  104. return 0;
  105. }

(2)*迷宫问题:求解m*n迷宫问题,输出解的个数及每个解。编写并实现它的算法。

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/551939
推荐阅读
相关标签
  

闽ICP备14008679号