久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4093|回復: 0
收起左側

循環隊列的實現-C語言教程

[復制鏈接]
ID:99624 發表于 2015-12-20 02:52 | 顯示全部樓層 |閱讀模式
     // 循環隊列的實現源碼:
#include"stdio.h"
#include"stdlib.h"

//這是一個靜態隊列的例程
#define MAXSIZE 10   //隊列的最大容量
typedef char ElemType;  //定義一個隊列元素類型,這種編程思路很好,程序有擴展空間
//聲明一個有關循環隊列的數據塊,注意每個元素的意義!
struct Queue
{
   ElemType *base;//數據類型頭指針
   int front;  //隊頭(front)進行隊列元素刪除操作的數組指針索引,很巧妙!
   int rear;  //隊尾(rear)進行隊列元素插入操作的數組指針索引,很巧妙!
};

//創建隊列或曰初始化隊列
void Queue_Iinit(Queue * q)
{
 //   q= new Queue;
  q->base=(ElemType *)malloc(MAXSIZE*sizeof(ElemType));//
  if(!q->base)
  {
    printf("內存分配失敗!\n");
exit(1);
  }
  q->front=q->rear=0;
  //這一步很重要!將隊頭和隊尾指針索引q->front,q->rea都賦值為0,即同時指向數組第一個元素

}
//入隊操作,入隊從隊尾rear處開始
void InsertQueue(Queue * q,ElemType e)
{
  if((q->rear+1)%MAXSIZE==q->front)//先判斷隊列是否已滿,因為入隊從隊尾rear處開始,所以先判斷rear指針索引
/*
  表達式(q->rear+1)%MAXSIZE也叫取模運算,該表達式能確保(q->rear+1)%MAXSIZE的結果小于MAXSIZE!
  這樣可以確保數組指針不越界。為什么要rear加1呢?騰出一個數據的空閑空間。
  這種算法很技巧!

  */
  {
     printf("隊列已滿!\n");
     return;
  
  }
  q->base[q->rear]=e;//
  q->rear=((q->rear+1)%MAXSIZE);//這一步既實現了指針前移同時還實現了指針不越界!技巧!

}
//出隊操作,出隊是從隊頭front處開始
void DeleteQueue(Queue * q,ElemType *e)
{
    if(q->front==q->rear)//已空,說明隊列元素已經刪除完畢
    {
 printf("老大,隊列已空!\n");
 return;
}
 //   *(e++)=q->base[q->front];//完成此步還不夠!還需要指針索引移位!注意賦值方法!
*e=q->base[q->front];//完成此步還不夠!還需要指針索引移位!注意賦值方法!
    q->front=(q->front+1)%MAXSIZE; //指針指向下一個空閑空間,確保不越界
    
  
 
}

//判斷隊列是否為空
bool EmptyQueue(Queue * q)  
{  
    if(q->front==q->rear)    //判斷是否為空  
{  
        printf("隊列已空!\n");
return true; 
}
    else  
        return false;  
}  
//判斷隊列是否為滿
bool FullQueue(Queue * q) 
{  
   if((q->rear+1)%MAXSIZE==q->front)   //判斷循環鏈表是否滿,留一個預留空間不用  
   {
 printf("隊列已滿!\n");
  return true; 
   } 
    else  
        return false;  
}  
/*********************************************** 
輸出每一個元素
************************************************/  
void TraverseQueue(Queue * q)  
{  
    int i=q->front;  
    printf("隊中的元素是:\n");  
    while( (i%MAXSIZE)!=q->rear )  //注意,這里沒有加1,打印每一個元素
    {  
        printf("%c\n ",q->base[i]);  
        i++;  
    }  
    printf("\n");  

}  
void main()
{
  
    Queue q;
char c;
   
    Queue_Iinit(&q);

printf("請輸入循環隊列元素,以#作為結束符\n");
 
scanf("%c",&c);//注意!本句表示一次輸入一個字符
  
InsertQueue(&q,c);
    
/*
  注意:比如輸入“1110010#”再按下回車鍵,字符串“1110010#”就以一次一個字符的順序輸入到PC鍵盤緩沖區即入棧;
  出棧時是以“后進先出”的順序出棧,剛好最后入棧的字符就是二進制的最低位。對于棧的操作一定要注意入棧出棧順序
*/ 

while(c!='#')
{

     scanf("%c",&c);//這里為什么還要此句呢?因為scanf()一次只能輸入一個字符,所以必須循環輸入
      InsertQueue(&q,c);
}
getchar();//改變鍵盤輸入緩存指針,即將回車鍵讀出來,這樣可以避免“\r”字符(回車鍵)輸出

TraverseQueue(&q);
    printf("開始出隊命令!\n"); 

 
   
    while(1)
{
    
DeleteQueue(&q,&c);
   printf("出隊:%c\n ",c);
if( EmptyQueue( &q))
break;
 
}

}
///////////////////////////////////----GKXW------------2015年11月14日18:47:4////////////////////////////////////////////////////

         我想,看完本篇內容uc/os-ii操作系統的“消息隊列”部分內容就可以輕松理解了。關于循環隊列,我的理解是:既節省了內存空間,同時在時間復雜度和空間復雜度上大大提高了效率。至于算法我們都是站在巨人的肩膀上學習學習再學習,很難想象如果沒有現成的代碼,我們要實現循環隊列的操作該有多難。 關于循環隊列算法真的非常精妙!學習本文能感受到C語言的魅力。

         隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列中沒有元素時,稱為空隊列。在隊列這種數據結構中,最先插入的元素將是最先被刪除的元素;反之最后插入的元素將最后被刪除的元素,因此隊列又稱為“先進先出”(FIFO—first in first out)的線性表。 隊列分為鏈式隊列和靜態隊列;靜態隊列一般用數組來實現,但此時的隊列必須是循環隊列,否則會造成巨大的內存浪費;鏈式隊列是用鏈表來實現隊列的。 

       由于隊列有元素出列,front就向后移動,所以隊列前面的空間就空了出來。為了更合理的利用空間,人們想了一個辦法:將隊列的首尾相連接。這樣當rear移動到
front處時,會再從0開始循環。那當什么時候隊列滿呢?當rear等于front的時候。可是隊列為空的時候也是同樣的條件,那不就沒法判斷了嗎?又有人提出了這樣的想法:犧牲一個存儲空間,front前面不存數據,當rear在front前面的時候就是滿了,如圖:


//////////////////////-------GKXW-----作者為本文付出很大心血,轉載請署名!-------////////////////////////////////


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄频视频 | 久久久久国产精品一区 | 中文字幕视频在线观看 | 国产精品久久久久久久久久免费看 | 女人天堂av| 青娱乐一区二区 | 一级黄色生活视频 | 精品免费看 | 91网在线观看 | 狠狠亚洲 | 久久九七 | 国产在线中文 | 日韩欧美国产综合 | 亚洲 欧美 在线 一区 | 免费在线观看黄视频 | 亚洲精品一区二区三区丝袜 | 欧美视频在线播放 | 亚洲欧美激情视频 | 在线国产一区二区 | 中文日韩在线 | 综合成人在线 | 欧美精品一区二区在线观看 | 女生羞羞网站 | 日韩在线播放第一页 | 成人毛片在线观看 | 日韩免费一区二区 | 日本黄色的视频 | 一区二区三区四区av | 国产精品视频久久 | 天天玩夜夜操 | 亚洲国产欧美精品 | 亚洲综合在线视频 | 在线播放一区二区三区 | 亚洲欧美日韩精品久久亚洲区 | 黄片毛片免费看 | 99一级毛片 | 国产国拍亚洲精品av | 国产高清在线精品 | 久久久久久免费毛片精品 | 精品一区二区三区在线观看 | 91精品国产91久久久久久吃药 |