亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

在編程語言中怎樣定義隊列及其使用(C++)

2020-05-23 12:53:25
字體:
來源:轉載
供稿:網友

隊列在編程語言中是如何定義的呢?小編與大家分享自己的經驗。

編程語言,定義隊列,C++

隊列的定義

隊列是限制結點插入操作固定在一端進行,而結點的刪除操作固定在另一端進行的線性表.

隊列猶如一個兩端開口的管道.允許插入的一端稱為隊頭,允許刪除的一端稱為隊尾.隊頭和隊尾各用一個”指針”指示,稱為隊頭指針和隊尾指針.不含任何結點的隊列稱為”空隊列”.隊列的特點是結點在隊列中的排隊次序和出隊次序按進隊時間先后確定,即先進隊者先出隊.因此,隊列又稱先進先出表.簡稱FIFO(first in first out)表.

步驟

隊列是用來存儲暫未處理但需要按一定順序處理的元素的一種數據結構。

編程語言,定義隊列,C++

隊列是一種先進先出(First In First Out,FIFO)的線性表,特點是先進隊的元素先出隊。

編程語言,定義隊列,C++

隊列只允許在表的一端進行插入,而在另一端刪除元素。

編程語言,定義隊列,C++

隊尾是隊列中允許插入的一端;隊首是隊列中允許刪除的一端。

編程語言,定義隊列,C++

一般用順序表q[m]存儲隊列中的元素,m是隊列能存儲元素的最大數量。

編程語言,定義隊列,C++

front隊首指針指向隊首元素存儲的位置;rear隊尾指針指向隊尾元素的下一個位置。

編程語言,定義隊列,C++

順序隊列及其操作

隊列的順序存儲結構

順序存儲結構存儲的隊列稱為順序隊列.和順序表一樣,用一個一維數組存.對頭在數組的低下標端,隊尾設在高下表端.隊頭,隊尾指針值是數組元素的下標.對頭指針始終指向對頭結點的前一個結點位置,初始值為0.隊尾指針是指向隊尾結點位置,初始值也為0.

編程語言,定義隊列,C++

隊列初始條件:隊頭指針=隊尾指針=0
隊列滿條件:隊尾指針=m(設隊列當前容量為m)
隊列空條件:隊頭指針=隊尾指針

在QueueCs.c文件中定義了結構

#define DT char#define M 100typedef struct {  DT data[M];  int front,rear;}SEQUEUE;

data[M]也為數組為隊列,front為隊頭指針,rear為隊尾指針.(注意:front和rear是整數類型,不是指針類型),當front=rear=0時,為初始隊列.因為C語言中數組的第一個元素下標為0,而不是1;所以這里約定數組元素data[0]閑置不用.

順序隊列上的操作

(1)創建隊列

初始化隊列,隊頭指針和隊尾指針=0.

在QueueControl.h寫出方法聲明

/* 創建隊列 */SEQUEUE initQueue();

在QueueControl.c中實現此方法

#include "QueueControl.h"/* 創建隊列 */SEQUEUE initQueue(){  SEQUEUE Q;  //1.初始化隊列,隊頭指針=隊尾指針=0  Q.front=Q.rear=0;  return Q;}

(2)插入

在QueueControl.h寫出方法聲明

/* 插入 */SEQUEUE inQueue(SEQUEUE Q,DT x);

在QueueControl.c中實現此方法

#include "QueueControl.h"SEQUEUE inQueue(SEQUEUE Q,DT x){  //1.判斷隊列是上溢,就是隊尾指針是否等于最大申請的空間  if(Q.rear==M){    printf("Up Overflow/n");  }else{     //2.從隊尾插入結點    Q.rear++;    Q.data[Q.rear]=x;    printf("in success/n");  }  return Q;}

(3)刪除

在QueueControl.h寫出方法聲明

/* 刪除 */SEQUEUE outQueue(SEQUEUE Q);/* 打印隊列元素 */void printQueue(SEQUEUE Q);

在QueueControl.c中實現此方法

#include "QueueControl.h"SEQUEUE outQueue(SEQUEUE Q){  //1.首先判斷是否是空隊列  if(Q.front==Q.rear){    printf("queue is empty/n");  }else{    //2.刪除結點是從隊頭刪除    Q.front++;     printf("out success/n");  }  return Q;}/* 打印隊列元素 */void printQueue(SEQUEUE Q){  //1.從隊頭開始打印數據  SEQUEUE temp=Q;  printf("queue={");  while (temp.front<temp.rear) {     temp.front++;    if(temp.front==Q.front+1){      printf("%c",temp.data[temp.front]);    }else{      printf(",%c",temp.data[temp.front]);    }  }  printf("}/n");}

在main.c中的main方法(int main(int argc, const char * argv[]) {})調用此方法,并且進行判斷

#include "QueueControl.h"int main(int argc, const char * argv[]) {  //初始化順序隊列  SEQUEUE queue=initQueue();  printQueue(queue);  //插入  queue=inQueue(queue, 'a');  queue=inQueue(queue, 'b');  queue=inQueue(queue, 'c');  queue=inQueue(queue, 'd');  printQueue(queue);  //刪除  queue=outQueue(queue);  printQueue(queue);  return 0;}

打印結果:

queue={}
in success
in success
in success
in success
queue={a,b,c,d}
out success
queue={b,c,d}
Program ended with exit code: 0

從插入隊列和刪除隊列操作的打印結果來看,隊列的特點確實是:先進先出.

循環隊列及其操作

循環隊列的存儲結構

根據順序隊列的操作和敘述可以看出,隊尾指針=m表示隊滿,不能再插入結點了,當隊頭指針等于隊尾指針表示對空.但是當隊尾指針和隊尾指針都等于m的時候,那么此時表示對空,那么也不能插入了其他的結點,但是此時0-m之間的結點已經空閑,這樣許多空閑的結點不能被利用,浪費存儲空間.

循環隊列是把順序隊列的頭尾相接形成一個圓環.邏輯上吧1號結點作為m號結點的后繼結點處理.

編程語言,定義隊列,C++

編程語言,定義隊列,C++

循環隊列初始條件:隊頭指針=隊尾指針=0
循環隊列隊滿條件:MOD(隊尾指針+1,m)=隊頭指針
循環隊列空條件:隊頭指針=隊尾指針
隊頭指針推進計算:隊頭指針=MOD(隊頭指針+1,m)
隊尾指針推進計算:隊尾指針=MOD(隊尾指針+1,m)

在QueueCycleCs.c文件中定義了結構

#define CDT char#define CM 5typedef struct {  CDT data[CM];  int front,rear;}SECYCLEQUEUE;

循環隊列上的操作

(1)創建循環隊列

初始化隊列,隊頭指針和隊尾指針=0.

在QueueCycyleControl.h寫出方法聲明

#include "QueueCycleCs.c"/* 創建循環隊列 */SECYCLEQUEUE initCycleQueue();

在QueueCycyleControl.c中實現此方法

#include "QueueCycleControl.h"/* 創建循環隊列 */SECYCLEQUEUE initCycleQueue(){  SECYCLEQUEUE Q;  //隊頭指針=隊尾指針=0;  Q.front=Q.rear=0;  return Q;}

(2)插入

在QueueCycyleControl.h寫出方法聲明

#include "QueueCycleCs.c"/* 循環隊列插入 */SECYCLEQUEUE inCycleQueue(SECYCLEQUEUE Q,char x);

在QueueCycyleControl.c中實現此方法

#include "QueueCycleControl.h"SECYCLEQUEUE inCycleQueue(SECYCLEQUEUE Q,CDT x){  //1.判斷循環隊列是否已經滿了,MOD(隊尾指針+1,m)=隊頭指針  if((Q.rear+1)%CM==Q.front){    printf("queue is full!/n");  }else{    //2.在隊尾插入,計算隊尾指針的    Q.rear=(Q.rear+1)%CM;    //3.設置插入結點的值數值    Q.data[Q.rear]=x;    printf("in Cycle queue Success!/n");  }  return Q;}

(3)刪除

在QueueCycyleControl.h寫出方法聲明

#include "QueueCycleCs.c"/* 循環隊列刪除 */SECYCLEQUEUE outCycleQueue(SECYCLEQUEUE Q);/* 打印循環隊列 */void printCycleQueue(SECYCLEQUEUE Q);

在QueueCycyleControl.c中實現此方法

#include "QueueCycleControl.h"SECYCLEQUEUE outCycleQueue(SECYCLEQUEUE Q){  //1.判斷循環隊列是否是空  if(Q.front==Q.rear){    printf("Cycle queue is Empty!/n");  }else{    //2.刪除結點從隊頭刪除,計算隊頭指針:隊頭指針=MOD(隊頭指針+1,m)    Q.front=(Q.front+1)%CM;    printf("out cycle queue success!/n");  }  return Q;}/* 打印循環隊列 */void printCycleQueue(SECYCLEQUEUE Q){  //M=5;  //1.從隊頭開始打印數據  SECYCLEQUEUE temp=Q;  printf("queue={");  //2.判斷的條件是,隊頭指針!=隊尾指針  while (temp.front!=temp.rear) {    temp.front=(temp.front+1)%CM;    if(temp.front==((Q.front+1)%CM)){      printf("%c",temp.data[temp.front]);    }else{      printf(",%c",temp.data[temp.front]);    }  }  printf("}/n");}

在main.c中的main方法(int main(int argc, const char * argv[]) {})調用此方法,并且進行判斷

#include "QueueCycleControl.h"int main(int argc, const char * argv[]) {  //創建循環隊列  SECYCLEQUEUE CQ=initCycleQueue();  //插入數據5個結點,但是最大是5,一個空閑,最后一個添加不進去,  CQ=inCycleQueue(CQ, 'a');  CQ=inCycleQueue(CQ, 'b');  CQ=inCycleQueue(CQ, 'c');  CQ=inCycleQueue(CQ, 'd');  CQ=inCycleQueue(CQ, 'e');  printCycleQueue(CQ);  //刪除節點-三個結點  CQ=outCycleQueue(CQ);  CQ=outCycleQueue(CQ);  CQ=outCycleQueue(CQ);  printCycleQueue(CQ);  //插入-兩個結點  CQ=inCycleQueue(CQ, 'e');  CQ=inCycleQueue(CQ, 'f');  printCycleQueue(CQ);  //刪除節點--刪除四個結點,現在此時是三個結點,最后一個刪除不了  CQ=outCycleQueue(CQ);  CQ=outCycleQueue(CQ);  CQ=outCycleQueue(CQ);  CQ=outCycleQueue(CQ);  printCycleQueue(CQ);  return 0;}

打印結果:

in Cycle queue Success!
in Cycle queue Success!
in Cycle queue Success!
in Cycle queue Success!
queue is full!
queue={a,b,c,d}
out cycle queue success!
out cycle queue success!
out cycle queue success!
queue=prv9h3b
in Cycle queue Success!
in Cycle queue Success!
queue={d,e,f}
out cycle queue success!
out cycle queue success!
out cycle queue success!
Cycle queue is Empty!
queue={}
Program ended with exit code: 0

鏈隊列及其操作

隊列的鏈存儲結構

鏈存儲結構存儲的隊列稱為鏈隊列.隊頭指針指向鏈隊列的頭結點,頭結點的指針域若為空,則為空隊列;若不為空,則為指向隊首結點的指針.

鏈隊列設有一個隊頭指針,其值指向隊列的頭結點.也是唯一地標示一個鏈隊.設置一個隊尾指針方便插入結點.隊頭指針和隊尾指針都是指針型變量.

鏈隊列沒有容量的限制,所以在可用的存儲空間范圍內,一般不會出現上溢問題,也不存在如順序隊列的假溢出問題. 

編程語言,定義隊列,C++

在QueueLinkCs.c中定義了結構

#define LDT char//結點類型typedef struct llnode{  LDT data;  struct llnode *next;}LINKNODE;//鏈隊列結構typedef struct{  LINKNODE *front,*rear;}LINKQUEUE;

鏈隊列上的操作

(1)創建鏈隊列

在QueueLinkControl.h寫出方法聲明

#include <stdio.h>#include "QueueLinkCs.c"/* 創建鏈隊 */LINKQUEUE * initLinkQueue(LINKQUEUE *LQ);

在QueueLinkControl.c中實現此方法

#include "QueueLinkControl.h"#include <stdlib.h>/* 創建鏈隊 */LINKQUEUE *initLinkQueue(LINKQUEUE *LQ){  //設置隊頭指針  LQ->front=(LINKNODE *)malloc(sizeof(LINKNODE));  LQ->front->data='#';//設置隊頭指針,也是頭結點的指針域  LQ->front->next=NULL;  //初始條件:隊頭指針和隊尾指針一致  LQ->rear=LQ->front;  return LQ;}

(2)插入

在QueueLinkControl.h寫出方法聲明

/* 鏈隊插入:隊尾 */LINKQUEUE * inLinkQueue(LINKQUEUE *LQ,LDT x);

在QueueLinkControl.c中實現此方法

(3)刪除

在QueueLinkControl.h寫出方法聲明

/* 鏈隊刪除:隊頭 */LINKQUEUE *outLinkQueue(LINKQUEUE *LQ);/* 打印鏈表結點 */void printLinkQueue(LINKQUEUE *LQ);

在QueueLinkControl.c中實現此方法

#include "QueueLinkControl.h"#include <stdlib.h>LINKQUEUE *outLinkQueue(LINKQUEUE *LQ){  if(LQ==NULL || LQ->rear==LQ->front){    printf("LQ is empty!/n");    return LQ;  }  //1.獲取首結點  LINKNODE *frontNextNode;  frontNextNode=LQ->front->next;  //2.將首節點的next指針域的值存儲頭結點的next域  LQ->front->next=frontNextNode->next;  //3.如果隊尾結點等于首節點的next指針域的值,那么表示是空棧,根據空鏈隊列的結構,還需修改隊尾指針,使指向頭結點.  if(LQ->rear==frontNextNode){    LQ->rear=LQ->front;  }  //4.釋放刪除的結點  free(frontNextNode);  printf("out link queue success!/n");  return LQ;}/* 打印鏈表結點 */void printLinkQueue(LINKQUEUE *Q){  //實例化一個LQ,為了不改變原來鏈隊Q  LINKQUEUE *LQ;  LQ=(LINKQUEUE *)malloc(sizeof(LINKQUEUE));  LQ->front=Q->front;  LQ->rear=Q->rear;  printf("queue={");  //1.判斷不是空鏈表  if(LQ!=NULL && LQ->rear!=LQ->front){    int flag=0;    do{      //2.輸出數據      if(flag==0){        printf("%c",LQ->front->data);        flag=1;      }else{        printf(",%c",LQ->front->data);      }      //3.鏈頭指針向后移動      LQ->front=LQ->front->next;    }while (LQ->front!=LQ->rear) ;   printf(",%c",LQ->front->data);  }  printf("}/n");}

在main.c中的main方法(int main(int argc, const char * argv[]) {})調用此方法,并且進行判斷

#include "QueueLinkControl.h"int main(int argc, const char * argv[]) {  //創建鏈隊列  LINKQUEUE *LQ=(LINKQUEUE *)malloc(sizeof(LINKQUEUE));  LQ=initLinkQueue(LQ);  //向鏈隊插入結點  LQ=inLinkQueue(LQ,'a');  LQ=inLinkQueue(LQ,'b');  LQ=inLinkQueue(LQ,'c');  LQ=inLinkQueue(LQ,'d');  printLinkQueue(LQ);  //刪除結點--從隊頭  LQ=outLinkQueue(LQ);  LQ=outLinkQueue(LQ);  printLinkQueue(LQ);  return 0;}

打印結果:

in link queue success!
in link queue success!
in link queue success!
in link queue success!
queue={#,a,b,c,d}
out link queue success!
out link queue success!
queue={#,c,d}
Program ended with exit code: 0

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美丰满老妇厨房牲生活| 中文字幕亚洲国产| 91色中文字幕| 久久久久久国产三级电影| 日韩成人在线视频观看| 国产亚洲欧美日韩美女| 欧美精品videosex极品1| 亚洲国产精品久久久久秋霞蜜臀| 精品国产鲁一鲁一区二区张丽| 国产精品综合不卡av| 自拍偷拍亚洲区| 亚洲国产天堂久久国产91| 日韩av综合中文字幕| 国产精品亚洲视频在线观看| 欧美一级电影久久| 国产精品视频久久久久| 色妞一区二区三区| 亚洲欧美另类中文字幕| 精品国产精品自拍| 色噜噜狠狠狠综合曰曰曰| 欧美精品videos性欧美| 欧美日韩国产成人在线观看| 中文字幕一精品亚洲无线一区| 97在线看福利| 国产日韩换脸av一区在线观看| 亚洲国产成人在线视频| 亚洲视频一区二区三区| 国产精品嫩草视频| 欧美性视频在线| 国产精品户外野外| 欧美日本在线视频中文字字幕| 5566日本婷婷色中文字幕97| 91视频九色网站| 欧美国产视频日韩| 青青草99啪国产免费| 久久国产精品免费视频| 韩国日本不卡在线| 亚洲91av视频| 69视频在线播放| 成人美女免费网站视频| 久久全球大尺度高清视频| 亚洲免费视频一区二区| 日韩免费视频在线观看| 中文字幕在线日韩| 国产精品色悠悠| 红桃视频成人在线观看| 亚洲成人久久久久| 欧美高清在线视频观看不卡| 奇米影视亚洲狠狠色| 国产成人综合精品| 色综合久久天天综线观看| 成人在线播放av| 日韩经典第一页| 自拍偷拍亚洲一区| 91国内免费在线视频| 国产精品视频久久久久| 成人妇女免费播放久久久| 国产精品女人久久久久久| 中文字幕在线视频日韩| 中文字幕亚洲无线码a| 国产一区玩具在线观看| 欧美大片在线免费观看| 国产精品普通话| 久久这里有精品视频| 日韩在线欧美在线国产在线| 91在线精品播放| 中文字幕在线亚洲| 91精品久久久久久久久久| 国产综合久久久久| 国产伦精品免费视频| 日韩av免费看| 国模私拍一区二区三区| 欧美大尺度激情区在线播放| 精品人伦一区二区三区蜜桃网站| 日韩欧美精品网址| 亚洲视频在线观看视频| 久久伊人精品一区二区三区| 国产精品久久久久免费a∨| 日韩激情视频在线| 欧美精品在线极品| 国产精品久久久久久久久久三级| 欧美日韩国产va另类| 日韩av手机在线看| 久久97久久97精品免视看| 久久天天躁狠狠躁夜夜爽蜜月| 欧美激情2020午夜免费观看| 成人网欧美在线视频| 91亚洲va在线va天堂va国| 91在线观看免费高清完整版在线观看| 成人黄色激情网| 精品福利一区二区| 成人在线视频福利| 韩剧1988免费观看全集| 亚洲第一网中文字幕| 日本国产精品视频| 黑丝美女久久久| 欧美中文字幕在线视频| 欧美激情精品久久久久久| 久久国产视频网站| 欧洲成人在线视频| 欧美日韩成人在线视频| 日本一区二区不卡| 亚洲男人的天堂在线播放| 欧美精品www| 欧洲成人在线观看| 亚洲缚视频在线观看| 日韩免费观看在线观看| 国产精品一香蕉国产线看观看| 国产亚洲综合久久| 中文字幕在线看视频国产欧美在线看完整| 日韩免费观看高清| 亚洲精品中文字幕女同| 福利一区视频在线观看| 欧美精品一区二区三区国产精品| 7m第一福利500精品视频| 亚洲日本中文字幕| 国产成人激情小视频| 91久久精品日日躁夜夜躁国产| 亚洲视频专区在线| 日韩av影片在线观看| 国产丝袜一区二区| 欧美在线国产精品| 国产精品极品美女在线观看免费| 美日韩精品免费观看视频| 欧美成人小视频| 日韩精品免费观看| 伊人伊成久久人综合网小说| 动漫精品一区二区| 清纯唯美日韩制服另类| 久久亚洲精品中文字幕冲田杏梨| 国产亚洲精品美女久久久| 欧美视频国产精品| 久久夜精品香蕉| 国产区精品在线观看| 国产综合福利在线| 亚洲片国产一区一级在线观看| 欧美性猛交视频| 亚洲欧美制服第一页| 日本久久久a级免费| 日韩成人在线视频观看| 亚洲黄色在线观看| 欧美精品免费看| 97视频在线观看免费| 亚洲男人的天堂在线播放| 亚洲aⅴ男人的天堂在线观看| 日本人成精品视频在线| 欧美极度另类性三渗透| 高清欧美一区二区三区| 懂色av影视一区二区三区| 欧美精品国产精品日韩精品| 成人精品视频99在线观看免费| 国产91对白在线播放| 成人精品久久一区二区三区| 亚洲欧美激情在线视频| 亚洲级视频在线观看免费1级| 欧美精品在线第一页| 欧美日韩高清在线观看| 91免费欧美精品| 久久国产精品久久国产精品| 久久久久亚洲精品成人网小说| 亚洲国产精品嫩草影院久久| 欧美日韩国产精品一区二区三区四区| 国产精品亚洲美女av网站| 亚洲激情小视频|