日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双向(端)链表、栈、队列

發布時間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双向(端)链表、栈、队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

雙端鏈表

?

雙端棧

?

雙端隊列

從實用角度,感受不出雙端隊列的好處,但其可以充當棧和隊列的角色.

參考資料:http://baike.baidu.com/view/1627726.htm

Test

static void Main() {var deque = new Deque<int>();Console.WriteLine("Stack:");//stackdeque.AddFirst(1);deque.AddFirst(2);deque.AddFirst(3);Console.WriteLine(deque.RemoveFirst());Console.WriteLine(deque.RemoveFirst());Console.WriteLine(deque.RemoveFirst());//queueConsole.WriteLine("Queue:");deque.AddFirst(1);deque.AddFirst(2);deque.AddFirst(3);Console.WriteLine(deque.RemoveLast());Console.WriteLine(deque.RemoveLast());Console.WriteLine(deque.RemoveLast()); }

當AddFirst和AddLast同時使用時則變成2個棧了

deque.AddFirst(1); deque.AddFirst(2); deque.AddFirst(3); deque.AddLast(6); deque.AddLast(7); deque.AddLast(8); Console.WriteLine(deque.RemoveLast()); Console.WriteLine(deque.RemoveLast()); Console.WriteLine(deque.RemoveLast()); Console.WriteLine(deque.RemoveFirst()); Console.WriteLine(deque.RemoveFirst()); Console.WriteLine(deque.RemoveFirst());

簡單實現

public interface IDeque<T> {void AddFirst(T node);void AddLast(T node);T RemoveFirst();T RemoveLast();T PeekFirst();T PeekLast(); }public class Deque<T> : IDeque<T> {private T[] _elements;private int head, end;public Deque(){_elements = new T[2];}//1,2,3,4public Deque(int capacity){_elements=new T[capacity];}public void AddFirst(T node){//loop indexif (--head < 0)head += _elements.Length;//val_elements[head] = node;//check capacityif (head == end)DoubleCapacity();}public void AddLast(T node){_elements[end] = node;if (++end < 0)end -= _elements.Length;if (head == end)DoubleCapacity();}private void DoubleCapacity(){int p = head;int n = _elements.Length;int r = n - p; int newCapacity = n << 1;T[] a = new T[newCapacity];Array.Copy(_elements, p, a, 0, r);Array.Copy(_elements, 0, a, r, p);_elements = (T[]) a;head = 0;end = n;}public T RemoveFirst(){T result = _elements[head]; _elements[head] = default(T); if (++head >= _elements.Length)head -= _elements.Length;return result;}public T RemoveLast(){if (--end < 0)end += _elements.Length;T result = _elements[end];_elements[end] = default(T);return result;}public T PeekFirst(){return _elements[head];}public T PeekLast(){if (end == 0)return _elements[_elements.Length - 1];elsereturn _elements[end - 1];}public int GetLength(){return (end - head) & (_elements.Length - 1);}public bool IsEmpty(){return head == end;}public void Display(){foreach (var element in _elements){Console.Write(element+",");}Console.WriteLine();} }

優先級隊列PriorityQueue

兩個主要的方法,我想的與源碼不同,結果是相同的,沒掌握一定技巧,以后回頭再看吧

/// <summary> /// 上濾,小為上,升序
/// </summary> /// <param name="item">The item.</param> private void PercolateUpAscending(T item) {int i;for (i = Count - 1; i >= 0; i--){if (Compare(_heap[i], item) > 0){_heap[i + 1] = _heap[i];}elsebreak;}_heap[++i] = item;Count++; }/// <summary> /// 上濾,大為上,降序 /// </summary> /// <param name="item">The item.</param> private void PercolateUpDescending(T item) {int i;for (i = Count - 1; i >= 0; i--){if (Compare(item, _heap[i]) > 0){_heap[i + 1] = _heap[i];}elsebreak;}_heap[++i] = item;Count++; }

轉載于:https://www.cnblogs.com/Clingingboy/archive/2011/01/03/1924651.html

總結

以上是生活随笔為你收集整理的双向(端)链表、栈、队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。