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

C#實(shí)現(xiàn)雙端隊(duì)列的示例代碼

 更新時(shí)間:2023年11月28日 09:41:39   作者:神仙別鬧  
雙端隊(duì)列是一種可以在兩端擴(kuò)展或收縮的序列化容器,本文主要介紹了C#實(shí)現(xiàn)雙端隊(duì)列的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下

話說(shuō)有很多數(shù)據(jù)結(jié)構(gòu)都在玩組合拳,比如說(shuō):塊狀鏈表,塊狀數(shù)組,當(dāng)然還有本篇的雙端隊(duì)列,是的,它就是棧和隊(duì)列的組合體。

一、概念

我們知道普通隊(duì)列是限制級(jí)的一端進(jìn),另一端出的 FIFO 形式,棧是一端進(jìn)出的 LIFO 形式,而雙端隊(duì)列就沒有這樣的限制,也就是我們可以在隊(duì)列兩端進(jìn)行插入或者刪除操作。

二、編碼

2.1、定義結(jié)構(gòu)體

通常情況下,隊(duì)列的內(nèi)部都是采用數(shù)組來(lái)實(shí)現(xiàn),而且?guī)в袃蓚€(gè)指針 head 和 tail 來(lái)指向數(shù)組的區(qū)間段,為了充分利用數(shù)組空間,我們也會(huì)用 % 來(lái)實(shí)現(xiàn)邏輯上的循環(huán)數(shù)組,如下圖。

image.png

 public class MyQueue
 {
     public int head;

     public int tail;

     public int maxSize;

     public int size;

     public T[] list;

     public MyQueue()
     {
         head = tail = size = 0;
         maxSize = 3;
         list = new T[maxSize];
     }
 }

這里有一個(gè)注意的細(xì)節(jié)就是“size 字段“,它是為了方便統(tǒng)計(jì)隊(duì)列是否為滿或者隊(duì)列是否為空。

2.2、隊(duì)尾入隊(duì)

剛才也說(shuō)了,雙端隊(duì)列是可以在隊(duì)列的兩端進(jìn)行插入和刪除的,要注意的是我們用 head 和 tail 指針的時(shí)候,tail 指針是指向元素的下一個(gè)位置,
而 head 指針是指向當(dāng)前元素,所以我們可以從 tail 端 push 數(shù)據(jù)的時(shí)候只要”順時(shí)針“下移一個(gè)位置即可。

 /// <summary>
 /// 隊(duì)尾入隊(duì)
 /// </summary>
 /// <param name="t"></param>
 /// <returns></returns>
 public bool Push_Tail(T t)
 {
     //判斷隊(duì)列是否已滿
     if (myQueue.size == myQueue.list.Length)
         return false;

     myQueue.list[myQueue.tail] = t;

     //順時(shí)針旋轉(zhuǎn)
     myQueue.tail = (myQueue.tail + 1) % myQueue.maxSize;

     myQueue.size++;

     return true;
 }

2.3、隊(duì)尾出隊(duì)

和隊(duì)尾入隊(duì)一樣,我們只要將 tail 指針”逆時(shí)針“下移一個(gè)位置,當(dāng)然有一個(gè)細(xì)節(jié)需要注意,就是 tail 指針有存在負(fù)值的情況,畢竟我們是做”–操作“的,所以需要 tail+maxSize,即:

myQueue.tail = (--myQueue.tail + myQueue.maxSize) % myQueue.maxSize;
 /// <summary>
 /// 隊(duì)尾出隊(duì)
 /// </summary>
 /// <param name="edges"></param>
 /// <param name="t"></param>
 public T Pop_Tail()
 {
     //判斷隊(duì)列是否已空
     if (myQueue.size == 0)
         return default(T);

     //逆時(shí)針旋轉(zhuǎn)(防止負(fù)數(shù))
     myQueue.tail = (--myQueue.tail + myQueue.maxSize) % myQueue.maxSize;

     var temp = myQueue.list[myQueue.tail];

     //賦予空值
     myQueue.list[myQueue.tail] = default(T);

     myQueue.size--;

     return temp;
 }

2.4、隊(duì)首入隊(duì)

從 head 端來(lái)說(shuō),我們 push 數(shù)據(jù)的時(shí)候是 head 指針“逆時(shí)針”旋轉(zhuǎn),要注意的是同樣要防止負(fù)數(shù)的產(chǎn)生,并且 head 指針是指向當(dāng)前元素。

 /// <summary>
 /// 隊(duì)首入隊(duì)
 /// </summary>
 /// <param name="t"></param>
 /// <returns></returns>
 public bool Push_Head(T t)
 {
     //判斷隊(duì)列是否已滿
     if (myQueue.size == myQueue.list.Length)
         return false;

     //逆時(shí)針旋轉(zhuǎn)(防止負(fù)數(shù)產(chǎn)生)
     myQueue.head = (--myQueue.head + myQueue.maxSize) % myQueue.maxSize;

     //賦予元素
     myQueue.list[myQueue.head] = t;

     myQueue.size++;

     return true;
 }

2.5、隊(duì)首出隊(duì)

說(shuō)到這個(gè)方法,我想大家應(yīng)該都懂了雙端隊(duì)列的大概流程了,這個(gè)方法我也不用贅敘了。

 /// <summary>
 /// 隊(duì)首出隊(duì)
 /// </summary>
 /// <param name="edges"></param>
 /// <param name="t"></param>
 public T Pop_Head()
 {
     //判斷隊(duì)列是否已空
     if (myQueue.size == 0)
         return default(T);

     //獲取隊(duì)首元素
     var temp = myQueue.list[myQueue.head];

     //原來(lái)單位的值賦默認(rèn)值
     myQueue.list[myQueue.head] = default(T);

     //順時(shí)針旋轉(zhuǎn)
     myQueue.head = (myQueue.head + 1) % myQueue.maxSize;

     myQueue.size--;

     return temp;
 }

從上面的四個(gè)方法可以看出:
當(dāng)我們只使用 Push_Tail 和 Pop_Tail 的話,那它就是棧。
當(dāng)我們只使用 Push_Tail 和 Pop_Head 的話,那它就是隊(duì)列。
最后是全部代碼:

 using System.Net;
 using System;
 using System.IO;
 using System.Collections.Generic;
 using System.Text;
 using System.Drawing;
 using System.Drawing.Imaging;
 
 class Program
 {
     static void Main(string[] args)
     {
         DoubleQueue<int> queue = new DoubleQueue<int>();
 
         queue.Push_Tail(10);
         queue.Push_Tail(20);
         queue.Push_Tail(30);
 
         queue.Pop_Tail();
         queue.Pop_Tail();
         queue.Pop_Tail();
 
         queue.Push_Tail(10);
         queue.Push_Head(20);
         queue.Push_Head(30);
         queue.Push_Head(30);
 
         queue.Pop_Tail();
         queue.Pop_Tail();
         queue.Pop_Head();
 
         queue.Push_Head(40);
         queue.Push_Tail(50);
         queue.Push_Tail(60);
     }
 }
 
 /// <summary>
 /// 雙端隊(duì)列
 /// </summary>
 public class DoubleQueue<T>
 {
     public class MyQueue
     {
         public int head;
 
         public int tail;
 
         public int maxSize;
 
         public int size;
 
         public T[] list;
 
         public MyQueue()
         {
             head = tail = size = 0;
             maxSize = 3;
             list = new T[maxSize];
         }
     }
 
     MyQueue myQueue = new MyQueue();
 
     /// <summary>
     /// 隊(duì)尾入隊(duì)
     /// </summary>
     /// <param name="t"></param>
     /// <returns></returns>
     public bool Push_Tail(T t)
     {
         //判斷隊(duì)列是否已滿
         if (myQueue.size == myQueue.list.Length)
             return false;
 
         myQueue.list[myQueue.tail] = t;
 
         //順時(shí)針旋轉(zhuǎn)
         myQueue.tail = (myQueue.tail + 1) % myQueue.maxSize;
 
         myQueue.size++;
 
         return true;
     }
 
     /// <summary>
     /// 隊(duì)尾出隊(duì)
     /// </summary>
     /// <param name="edges"></param>
     /// <param name="t"></param>
     public T Pop_Tail()
     {
         //判斷隊(duì)列是否已空
         if (myQueue.size == 0)
             return default(T);
 
         //逆時(shí)針旋轉(zhuǎn)(防止負(fù)數(shù))
         myQueue.tail = (--myQueue.tail + myQueue.maxSize) % myQueue.maxSize;
 
         var temp = myQueue.list[myQueue.tail];
 
         //賦予空值
         myQueue.list[myQueue.tail] = default(T);
 
         myQueue.size--;
 
         return temp;
     }
 
     /// <summary>
     /// 隊(duì)首入隊(duì)
     /// </summary>
     /// <param name="t"></param>
     /// <returns></returns>
     public bool Push_Head(T t)
     {
         //判斷隊(duì)列是否已滿
         if (myQueue.size == myQueue.list.Length)
             return false;
 
         //逆時(shí)針旋轉(zhuǎn)(防止負(fù)數(shù)產(chǎn)生)
         myQueue.head = (--myQueue.head + myQueue.maxSize) % myQueue.maxSize;
 
         //賦予元素
         myQueue.list[myQueue.head] = t;
 
         myQueue.size++;
 
         return true;
     }
 
     /// <summary>
     /// 隊(duì)首出隊(duì)
     /// </summary>
     /// <param name="edges"></param>
     /// <param name="t"></param>
     public T Pop_Head()
     {
         //判斷隊(duì)列是否已空
         if (myQueue.size == 0)
             return default(T);
 
         //獲取隊(duì)首元素
         var temp = myQueue.list[myQueue.head];
 
         //原來(lái)單位的值賦默認(rèn)值
         myQueue.list[myQueue.head] = default(T);
 
         //順時(shí)針旋轉(zhuǎn)
         myQueue.head = (myQueue.head + 1) % myQueue.maxSize;
 
         myQueue.size--;
 
         return temp;
     }
 }

到此這篇關(guān)于C#實(shí)現(xiàn)雙端隊(duì)列的示例代碼的文章就介紹到這了,更多相關(guān)C# 雙端隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

最新評(píng)論