【數據結構】循環隊列理解及練習



最近對循環隊列進行了深入瞭解,根據自己的理解用AI畫了下面的示意圖,並對其要點進行了歸納。如下所示:

 

下面是書上的習題,設計一個可以在隊頭和隊尾進行入隊、出隊的隊列,算是循環隊列的練習升級版,代碼如下:

// ConsoleApplication1.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
const int  MAXSIZE = 100;//循環隊列長度,可存儲的最大數據個數爲MAXSIZE-1
typedef struct cycQueue{
 int data[MAXSIZE];
 int front, rear;
}cycQueue;//數據類型定義

void initQueue(cycQueue  *& Q)//使用指針的引用
{
 Q = (cycQueue*)malloc(sizeof(cycQueue));
 Q->front = Q->rear=0;
}
int empty(cycQueue* Q)
{
 if (Q->front == Q->rear)
  return 1;
 else
  return 0;
}
int enQueue_f(cycQueue * Q, int x)//從隊頭入隊
{
 if ((Q->front - 1 + MAXSIZE) % MAXSIZE == Q->rear)//判斷隊是否爲滿
  return 0;
 else
 {
  Q->data[Q->front] = x;//將x賦值給當前front指向的地址
  Q->front = (Q->front - 1 + MAXSIZE) % MAXSIZE;//將front指向下一個front
  return 1;
 }
}
int enQueue_r(cycQueue*Q, int x)//從隊尾入隊
{
 if ((Q->rear + 1) % MAXSIZE == Q->front)//判斷隊是否爲滿
  return 0;
 else
 {
  Q->data[(Q->rear + 1) % MAXSIZE] = x;//將x賦值給當前rear的下一個位置
  Q->rear = (Q->rear + 1) % MAXSIZE;
  return 1;
 }
}
int deQueue_f(cycQueue*Q, int &x)//從隊頭出隊
{
 if (Q->rear == Q->front)//判斷隊是否爲空
  return 0;
 else
 {
  x = Q->data[(Q->front + 1) % MAXSIZE];//將當前front指向的下一個位置的值賦給x,注:front沒有存儲有用值
  Q->front = (Q->front + 1) % MAXSIZE;//將front往前移動一位
  return 1;
 }
}
int deQueue_r(cycQueue*Q, int&x)//從隊尾出隊
{
 if (Q->rear == Q->front)//判斷隊列是否爲空
  return 0;
 else
 {
  x = Q->data[Q->rear];//將當前隊尾元素賦值給x
  Q->rear = (Q->rear - 1 + MAXSIZE) % MAXSIZE;//將當前隊尾後移一位
  return 1;
 }
}

//以下是測試函數
int _tmain(int argc, _TCHAR* argv[])
{
 cycQueue * Q;
 int x;
 initQueue(Q);

 //1、頭插法入隊、出隊,功能類似棧
 for (int i = 0; i < 10; i++)
  enQueue_f(Q, i);
 while (!empty(Q))
 {
  deQueue_f(Q, x);
  cout << x << endl;
 }
 cout << "==============================\n";
 //2、尾插法入隊、出隊,功能類似棧
 for (int i = 0; i < 10; i++)
  enQueue_r(Q, i);
 while (!empty(Q))
 {
  deQueue_r(Q, x);
  cout << x << endl;
 }
 cout << "==============================\n";
 //3、頭入隊,尾出隊
 for (int i = 0; i < 10; i++)
  enQueue_f(Q, i);
 while (!empty(Q))
 {
  deQueue_r(Q, x);
  cout << x << endl;
 }
 cout << "==============================\n";
 //4、尾出隊,頭入隊
 for (int i = 0; i < 10; i++)
  enQueue_r(Q, i);
 while (!empty(Q))
 {
  deQueue_f(Q, x);
  cout << x << endl;
 }
 return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章