程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中隊列的樹立與操作具體解析

C++中隊列的樹立與操作具體解析

編輯:關於C++

C++中隊列的樹立與操作具體解析。本站提示廣大學習愛好者:(C++中隊列的樹立與操作具體解析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中隊列的樹立與操作具體解析正文


甚麼是隊列構造

隊列構造是從數據運算來分類的,也就是說隊列構造具有特別的運算規矩。而從數據的邏輯構造來看,隊列構造其實就是一種線性構造。假如從數據的存儲構造來進一步劃分,隊列構造可以分紅兩類。

次序隊列構造:即便用一組地址持續的內存單位順次保留隊列中的數據。在法式中,可以界說一個指定年夜小的構造數組來作為隊列。

鏈式隊列構造:即便用鏈表情勢保留隊列中各元素的值。

在隊列構造中許可對兩頭停止操作,然則兩頭的操作分歧。在表的一端只能停止刪除操作,稱為隊頭;在表的另外一端只能停止拔出操作,稱為隊尾。假如隊列中沒稀有據元素,則稱之為空隊列。從數據的運算角度剖析,隊列是依照“先輩先出”的准繩處置結點的。

可以將隊列構造懂得成是:超市列隊結賬的人群,排在隊首的人先結賬,然後赓續會有人排在隊尾期待結賬,這就是一個先來先辦事的隊列的實際中的例子。

普通隊列構造的根本操作只要兩個:

入隊列:將一個元素添加到隊尾(相當於到隊列最初列隊期待)

出隊列:將仇人的元素掏出,同時刪除該元素,使後一個元素成為隊頭。

首次以外,還有初始化隊列、獲得隊列長度的簡略運算。上面,我們就是用C++樹立次序隊列構造,並完成次序隊列構造的根本運算。
預備數據

預備數據就是界說在隊列操作中須要用到的變量及數據構造等。

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

這裡,界說了隊列構造的最年夜長度QUEUELEN ,隊列構造數據元素的類型DATA和隊列構造的數據構造SQType。在數據構造SQType中,data為數據元素,head為隊首的序號,tail為隊尾的序號。當head=0時表現隊列為空,當tail=QUEUELEN時表現隊列滿。

初始化隊列數據

次序隊列的初始化操作步調以下:

(1)按符號常量QUEUELEN指定的年夜小請求一段內存空間,用來保留隊列中的數據。

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

示例代碼以下:

SQType *SQTypeInit()
{
 SQType * q;
 if(q=new SQType)    //請求隊列的內存空間
 {
  q->head=0;     //設置隊首 
  q->tail=0;     //設置隊尾
  return q;
 }
 else
 {
  return NULL;    //前往空
 }
}

起首應用new請求內存,請求勝利今後設置隊頭和隊尾,然後前往請求內存的首地址,假如請求掉敗則前往NULL。

斷定空隊列

斷定空隊列是斷定一個隊列構造能否為空。假如是空隊列,則表現該隊列構造中國沒稀有據。此時可以進入如隊列操作,弗成以停止出隊列操作。

示例代碼以下:

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

輸出參數q為一個指向操作的隊列的指針。法式中,依據隊列head能否等於tail斷定隊列能否為空。

斷定滿隊列

斷定滿隊列就是斷定一個隊列構造能否為滿。假如是滿隊列,則表現該隊列中沒有過剩的空間來保留額定數據。測試弗成以停止入隊列操作,可以停止出隊列操作。

示例代碼以下:

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

輸出參數q為一個指向操作的隊列的指針。法式中,依據隊列tail能否等於隊列的最年夜值QUEUELEN斷定隊列能否是滿的。

清空隊列

清空隊列就是清晰一個隊列中的一切的數據。示例代碼以下:

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

將隊列頂指針head和尾指針tail設置為0,表現履行清空操作。

釋放空間

釋放空間是釋放隊列構造所占用的內存單位。由後面可知,在初始化隊列構造時,應用了new症結字分派內存單位。固然可使用清空隊列操作,然則清空隊列操作並沒有釋放內存空間,這就須要應用delete症結字釋放所占的內存單位。

示例代碼以下:

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


法式中,挪用了得delete釋放new請求的內存空間。

入隊列

入隊列是隊列構造的根本操作,重要操作是將數據元素保留到隊列構造。入隊列操作的詳細步調以下:

(1)起首斷定隊尾,假如tail等於QUEUELEN,則表現溢出,停止失足處置。不然履行以下操作。

(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; 
 } 
}

輸出參數q為指向操作的隊列的指針,輸出參數data為須要入隊列的數據元素。法式中起首斷定隊列能否溢出,假如溢出則不停止入隊列操作,不然修正隊列頂指針的值,再將元素入隊列。

由於tail的值從0開端,以後的值就是要拔出的數組對應的元素的地位,所以寫成q->tail++。

出隊列

出隊列是隊列構造的根本操作,重要操作與入隊列相反,其實從隊列頂彈出一個數據元素。出隊列操作的詳細步調以下:

(1)起首斷定隊首head,假如head等於tail,則表現為空隊列,停止失足處置。不然,履行上面的步調

(2)從隊列首部掏出隊頭元素(現實前往隊頭元素的指針)

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

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

輸出參數q為指向操作的隊列的指針。該函數前往值是一個DATA類型的數據,前往值是指向該數據元素的指針。

讀結點數據

讀結點數據也就是讀取隊列構造中結點的數據,這裡的讀操作其實就是讀隊列頭的數據。須要助於的是,讀結點數據的操作和出隊列操作分歧。讀結點數據的操作僅是顯示隊列頂結點數據的內容,而出隊列操作則將隊列頂數據彈出,該數據不再存在。

示例代碼以下:

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

}

該函數前往值異樣是一個DATA類型的指針數據,前往值是指向數據元素的指針。

盤算隊列長度

盤算隊列長度就是統計該隊列中數據結點的個數。盤算隊列長度的辦法比擬簡略,直接隊尾序號減去隊首序號便可。

示例代碼以下:

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

隊列構造操作實例代碼:

完全的代碼會比擬長,不外函數部門和下面引見的根本分歧,重要是看main函數中這些函數的用法:

#include<iostream>
#include<string>
using namespace std;
#define QUEUELEN 10
struct DATA{
 string name;
 int age;
};
struct SQType
{
 DATA data[QUEUELEN];   //隊列數組
 int head;      //隊頭
 int tail;      //隊尾
};
/*******************隊列的初始化*************************/
SQType *SQTypeInit()
{
 SQType * q;
 if(q=new SQType)    //請求隊列的內存空間
 {
  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++]);
 }
}
/*******************讀結點數據*************************/
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); 
}
/*********************主函數******************************/
int main()
{
 SQType *stack;
 DATA data,*p;
 stack=SQTypeInit();     //履行初始化操作
 cout<<"履行入隊列操作:"<<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<<"讀取首結點數據:"<<endl;
 p=PeekSQType(stack);
 cout<<p->name<<","<<p->age<<endl;
 cout<<"履行出棧操作:"<<endl;
 while(1)
 {
  if(SQTypeIsEmpty(stack))
  {
   cout<<"一切數據出棧終了,棧為空!"<<endl;
   break;
  }else
  {
   p=OutSQType(stack);
   cout<<p->name<<","<<p->age<<endl;
  } 
 }
 SQTypeFree(stack);
 return 0;
}

法式運轉界面:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved