欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中隊列的建立與操作詳細解析

 更新時間:2013年10月14日 09:33:21   作者:  
隊列結構是從數(shù)據(jù)運算來分類的,也就是說隊列結構具有特殊的運算規(guī)則。而從數(shù)據(jù)的邏輯結構來看,隊列結構其實就是一種線性結構。如果從數(shù)據(jù)的存儲結構來進一步劃分,隊列結構可以分成兩類

什么是隊列結構

隊列結構是從數(shù)據(jù)運算來分類的,也就是說隊列結構具有特殊的運算規(guī)則。而從數(shù)據(jù)的邏輯結構來看,隊列結構其實就是一種線性結構。如果從數(shù)據(jù)的存儲結構來進一步劃分,隊列結構可以分成兩類。

順序隊列結構:即使用一組地址連續(xù)的內(nèi)存單元依次保存隊列中的數(shù)據(jù)。在程序中,可以定義一個指定大小的結構數(shù)組來作為隊列。

鏈式隊列結構:即使用鏈表形式保存隊列中各元素的值。

在隊列結構中允許對兩端進行操作,但是兩端的操作不同。在表的一端只能進行刪除操作,稱為隊頭;在表的另一端只能進行插入操作,稱為隊尾。如果隊列中沒有數(shù)據(jù)元素,則稱之為空隊列。從數(shù)據(jù)的運算角度分析,隊列是按照“先進先出”的原則處理結點的。

可以將隊列結構理解成是:超市排隊結賬的人群,排在隊首的人先結賬,然后不斷會有人排在隊尾等待結賬,這就是一個先來先服務的隊列的現(xiàn)實中的例子。

一般隊列結構的基本操作只有兩個:

入隊列:將一個元素添加到隊尾(相當于到隊列最后排隊等待)

出隊列:將對頭的元素取出,同時刪除該元素,使后一個元素成為隊頭。

初次之外,還有初始化隊列、獲取隊列長度的簡單運算。下面,我們就是用C++建立順序隊列結構,并完成順序隊列結構的基本運算。
準備數(shù)據(jù)

準備數(shù)據(jù)就是定義在隊列操作中需要用到的變量及數(shù)據(jù)結構等。

復制代碼 代碼如下:

struct DATA{
 string name;
 int age;
};
struct SQType
{
 DATA data[QUEUELEN];   //隊列數(shù)組
 int head;      //隊頭
 int tail;      //隊尾
};

這里,定義了隊列結構的最大長度QUEUELEN ,隊列結構數(shù)據(jù)元素的類型DATA以及隊列結構的數(shù)據(jù)結構SQType。在數(shù)據(jù)結構SQType中,data為數(shù)據(jù)元素,head為隊首的序號,tail為隊尾的序號。當head=0時表示隊列為空,當tail=QUEUELEN時表示隊列滿。

初始化隊列數(shù)據(jù)

順序隊列的初始化操作步驟如下:

(1)按符號常量QUEUELEN指定的大小申請一段內(nèi)存空間,用來保存隊列中的數(shù)據(jù)。

(2)設置head=0和tail=0,表示一個空棧。

示例代碼如下:

復制代碼 代碼如下:

SQType *SQTypeInit()
{
 SQType * q;
 if(q=new SQType)    //申請隊列的內(nèi)存空間
 {
  q->head=0;     //設置隊首 
  q->tail=0;     //設置隊尾
  return q;
 }
 else
 {
  return NULL;    //返回空
 }
}

首先使用new申請內(nèi)存,申請成功以后設置隊頭和隊尾,然后返回申請內(nèi)存的首地址,如果申請失敗則返回NULL。

判斷空隊列

判斷空隊列是判斷一個隊列結構是否為空。如果是空隊列,則表示該隊列結構中國沒有數(shù)據(jù)。此時可以進入如隊列操作,不可以進行出隊列操作。

示例代碼如下:

復制代碼 代碼如下:

int SQTypeIsEmpty(SQType *q)
{
 return(q->head==q->tail);
}

輸入?yún)?shù)q為一個指向操作的隊列的指針。程序中,根據(jù)隊列head是否等于tail判斷隊列是否為空。

判斷滿隊列

判斷滿隊列就是判斷一個隊列結構是否為滿。如果是滿隊列,則表示該隊列中沒有多余的空間來保存額外數(shù)據(jù)。測試不可以進行入隊列操作,可以進行出隊列操作。

示例代碼如下:

復制代碼 代碼如下:

int SQTypeIsFull(SQType *q)
{
 return(q->tail==QUEUELEN)
}

輸入?yún)?shù)q為一個指向操作的隊列的指針。程序中,根據(jù)隊列tail是否等于隊列的最大值QUEUELEN判斷隊列是否是滿的。

清空隊列

清空隊列就是清楚一個隊列中的所有的數(shù)據(jù)。示例代碼如下:

復制代碼 代碼如下:

void SQTypeClear(SQType *q)
{
 q->head=0;
 q->tail=0;
}

將隊列頂指針head和尾指針tail設置為0,表示執(zhí)行清空操作。

釋放空間

釋放空間是釋放隊列結構所占用的內(nèi)存單元。由前面可知,在初始化隊列結構時,使用了new關鍵字分配內(nèi)存單元。雖然可以使用清空隊列操作,但是清空隊列操作并沒有釋放內(nèi)存空間,這就需要使用delete關鍵字釋放所占的內(nèi)存單元。

示例代碼如下:

復制代碼 代碼如下:

void SQTypeFree(SQType *q)
{
 if(q!=NULL) delete q;
}


程序中,調(diào)用了得delete釋放new申請的內(nèi)存空間。

入隊列

入隊列是隊列結構的基本操作,主要操作是將數(shù)據(jù)元素保存到隊列結構。入隊列操作的具體步驟如下:

(1)首先判斷隊尾,如果tail等于QUEUELEN,則表示溢出,進行出錯處理。否則執(zhí)行以下操作。

(2)設置tail=tail+1(隊列頂指針加1,指向入隊列地址)

(3)就將入隊列元素保存到tail指向的位置

示例代碼如下:

復制代碼 代碼如下:

int InSQType(SQType *q,DATA data)
{
 if(q->tail==QUEUELEN)
 {
  cout<<"隊列已滿!操作失??!"<<endl;
  return 0;
 }else
 {
  q-data[q->tail++]=data;      //將元素入隊列
  return 1; 
 } 
}

輸入?yún)?shù)q為指向操作的隊列的指針,輸入?yún)?shù)data為需要入隊列的數(shù)據(jù)元素。程序中首先判斷隊列是否溢出,如果溢出則不進行入隊列操作,否則修改隊列頂指針的值,再將元素入隊列。

因為tail的值從0開始,當前的值就是要插入的數(shù)組對應的元素的位置,所以寫成q->tail++。

出隊列

出隊列是隊列結構的基本操作,主要操作與入隊列相反,其實從隊列頂彈出一個數(shù)據(jù)元素。出隊列操作的具體步驟如下:

(1)首先判斷隊首head,如果head等于tail,則表示為空隊列,進行出錯處理。否則,執(zhí)行下面的步驟

(2)從隊列首部取出隊頭元素(實際返回隊頭元素的指針)

(3)修改隊首head的序號,使其指向后一個元素。
示例代碼如下:

復制代碼 代碼如下:

DATA *OutSQType(SQType *q)
{
 if(q->tail==q->head)
 {
  cout<<"隊列已空!操作失?。?<<endl;
  exit(0);  
 }else
 {
  return &(q->data[q->head++]);
 }
}

輸入?yún)?shù)q為指向操作的隊列的指針。該函數(shù)返回值是一個DATA類型的數(shù)據(jù),返回值是指向該數(shù)據(jù)元素的指針。

讀結點數(shù)據(jù)

讀結點數(shù)據(jù)也就是讀取隊列結構中結點的數(shù)據(jù),這里的讀操作其實就是讀隊列頭的數(shù)據(jù)。需要助于的是,讀結點數(shù)據(jù)的操作和出隊列操作不同。讀結點數(shù)據(jù)的操作僅是顯示隊列頂結點數(shù)據(jù)的內(nèi)容,而出隊列操作則將隊列頂數(shù)據(jù)彈出,該數(shù)據(jù)不再存在。

示例代碼如下:

復制代碼 代碼如下:

DATA * PeekSQType(SQType *q)
{
 if(SQTypeIsEmpty(q))
 {
  cout<<"空隊列"<<endl;
  return NULL; 
 }else
 {
  return &(q->data[q->head]);
 }

}

該函數(shù)返回值同樣是一個DATA類型的指針數(shù)據(jù),返回值是指向數(shù)據(jù)元素的指針。

計算隊列長度

計算隊列長度就是統(tǒng)計該隊列中數(shù)據(jù)結點的個數(shù)。計算隊列長度的方法比較簡單,直接隊尾序號減去隊首序號即可。

示例代碼如下:

復制代碼 代碼如下:

int SQTypeLen(SQType *q)
{
 return(q->tail-q->head); 
}

隊列結構操作實例代碼:

完整的代碼會比較長,不過函數(shù)部分和上面介紹的基本一致,主要是看main函數(shù)中這些函數(shù)的用法:

復制代碼 代碼如下:

#include<iostream>
#include<string>
using namespace std;
#define QUEUELEN 10
struct DATA{
 string name;
 int age;
};
struct SQType
{
 DATA data[QUEUELEN];   //隊列數(shù)組
 int head;      //隊頭
 int tail;      //隊尾
};
/*******************隊列的初始化*************************/
SQType *SQTypeInit()
{
 SQType * q;
 if(q=new SQType)    //申請隊列的內(nèi)存空間
 {
  q->head=0;     //設置隊首 
  q->tail=0;     //設置隊尾
  return q;
 }
 else
 {
  return NULL;    //返回空
 }
}
/*******************判斷空隊列*************************/
int SQTypeIsEmpty(SQType *q)
{
 return(q->head==q->tail);
}
/*******************判斷滿隊列*************************/
int SQTypeIsFull(SQType *q)
{
 return(q->tail==QUEUELEN);
}
/*******************清空隊列*************************/
void SQTypeClear(SQType *q)
{
 q->head=0;
 q->tail=0;
}
/*******************釋放空間*************************/
void SQTypeFree(SQType *q)
{
 if(q!=NULL) delete q;
}
/*******************入隊列操作*************************/
int InSQType(SQType *q,DATA data)
{
 if(q->tail==QUEUELEN)
 {
  cout<<"隊列已滿!操作失?。?<<endl;
  return 0;
 }else
 {
  q->data[q->tail++]=data;      //將元素入隊列
  return 1; 
 } 
}
/*******************出隊列操作*************************/
DATA *OutSQType(SQType *q)
{
 if(q->tail==q->head)
 {
  return NULL;  
 }else
 {
  return &(q->data[q->head++]);
 }
}
/*******************讀結點數(shù)據(jù)*************************/
DATA * PeekSQType(SQType *q)
{
 if(SQTypeIsEmpty(q))
 {
  cout<<"空隊列"<<endl;
  return NULL; 
 }else
 {
  return &(q->data[q->head]);
 }

}
/*******************計算隊列長度*************************/
int SQTypeLen(SQType *q)
{
 return(q->tail-q->head); 
}
/*********************主函數(shù)******************************/
int main()
{
 SQType *stack;
 DATA data,*p;
 stack=SQTypeInit();     //執(zhí)行初始化操作
 cout<<"執(zhí)行入隊列操作:"<<endl;
 cout<<"輸入姓名,年齡進行入隊操作:"<<endl;
 while(1)
 {
  cin>>data.name>>data.age;
  if(data.age==0)
  {
   break;      //若輸入為0,則退出
  }
  else
  {
   InSQType(stack,data); 
  } 
 }
 cout<<"進行出棧操作:"<<endl;
 p=OutSQType(stack);
 cout<<p->name<<","<<p->age<<endl;
 cout<<"讀取首結點數(shù)據(jù):"<<endl;
 p=PeekSQType(stack);
 cout<<p->name<<","<<p->age<<endl;
 cout<<"執(zhí)行出棧操作:"<<endl;
 while(1)
 {
  if(SQTypeIsEmpty(stack))
  {
   cout<<"所有數(shù)據(jù)出棧完畢,棧為空!"<<endl;
   break;
  }else
  {
   p=OutSQType(stack);
   cout<<p->name<<","<<p->age<<endl;
  } 
 }
 SQTypeFree(stack);
 return 0;
}

程序運行界面:

相關文章

  • C語言中枚舉與指針的實例詳解

    C語言中枚舉與指針的實例詳解

    這篇文章主要介紹了 C語言中枚舉與指針的實例詳解的相關資料,希望通過本文大家能夠掌握枚舉與指針的知識,需要的朋友可以參考下
    2017-09-09
  • C++11互斥量的具體使用

    C++11互斥量的具體使用

    互斥量是一種同步原語,是一種線程同步的手段,用來保護多線程同時訪問的共享數(shù)據(jù),本文主要介紹了C++11互斥量的具體使用,感興趣的可以了解一下
    2023-11-11
  • C++繼承的定義與注意事項

    C++繼承的定義與注意事項

    這篇文章主要給大家介紹了關于C++繼承的定義與注意事項的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • OpenCV實現(xiàn)視頻綠幕背景替換功能的示例代碼

    OpenCV實現(xiàn)視頻綠幕背景替換功能的示例代碼

    這篇文章主要介紹了如何利用OpenCV實現(xiàn)視頻綠幕背景替換功能,文中的示例代碼講解詳細,對我們學習OpenCV有一定的幫助,感興趣的可以學習一下
    2023-02-02
  • C/C++的內(nèi)存管理你了解嘛

    C/C++的內(nèi)存管理你了解嘛

    這篇文章主要為大家介紹了C/C++的內(nèi)存管理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++設計模式之訪問者模式

    C++設計模式之訪問者模式

    這篇文章主要介紹了C++設計模式之訪問者模式,本文講解了什么是訪問者模式、訪問者模式的UML類圖、訪問者模式的實現(xiàn)代碼等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C,C++中常用的操作字符串的函數(shù)

    C,C++中常用的操作字符串的函數(shù)

    這篇文章主要介紹了C,C++中常用的操作字符串的函數(shù),需要的朋友可以參考下
    2017-09-09
  • C語言 文件的隨機讀寫詳解及示例代碼

    C語言 文件的隨機讀寫詳解及示例代碼

    本文主要介紹C語言 文件的隨機讀寫,這里整理了相關資料及示例代碼以便大家學習參考,學習此部分內(nèi)容的朋友可以參考下
    2016-08-08
  • Qt開發(fā)之QString類的使用教程詳解

    Qt開發(fā)之QString類的使用教程詳解

    本文主要介紹了Qt中QString類的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-11-11
  • VC實現(xiàn)Windows多顯示器編程的方法

    VC實現(xiàn)Windows多顯示器編程的方法

    這篇文章主要介紹了VC實現(xiàn)Windows多顯示器編程的方法,涉及VC獲取屏幕分辨率及顯示參數(shù)等技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10

最新評論