數據結構——隊列和棧

1. 簡介

隊列是一種特殊的線性表,它只容許在表的前端(front)進行刪除(出隊)操做,而在表的後端(rear)進行插入(入隊)操做。html

棧又名堆棧,它和隊列同樣也是一種運算受限的線性表。限定僅在表尾進行插入和刪除操做的線性表。這一端被稱爲棧頂,相對地,把另外一端稱爲棧底。與先進先出隊列相比,棧的運做模式是後進先出。前端

2.具體實現

棧和鏈表屬於線性表,意味着它能夠基於數組和鏈表來實現,它們和普通線性表相比只是在增長和刪除元素時只能在首尾操做,咱們只用提供push和pop接口,實現起來十分簡單。後端

關於數組鏈表,有不明白的同窗能夠看我前面寫的博文。數組

在這裏咱們使用原生列表來實現,實際上使用咱們前面實現的動態數組和鏈表也是徹底沒有問題的。數據結構

Python:app

class Stack:
    def __init__(self,*args):
        self.data = []

    def push(self,item):
        self.data.append(item)

    def pop(self):
        item = self.data.pop()
        return item

class Queue:
    def __init__(self,*args):
        self.data = []

    def push(self,item):
        self.data.append(item)

    def pop(self):
        item = self.data.pop(0)
        return item

C#:spa

class Queue<T>
{
    private List<T> data;
    public Queue()
    {
        data = new List<T>();
    }

    public void push(T item)
    {
        data.Add(item);
    }

    public T pop()
    {
        T res = data[0];
        data.RemoveAt(0);
        return res;
    }
}

class Stack<T>
{
    private List<T> data;
    public Stack()
    {
        data = new List<T>();
    }

    public void push(T item)
    {
        data.Add(item);
    }

    public T pop()
    {
        T res = data[data.Count - 1];
        data.RemoveAt(data.Count - 1);
        return res;
    }
}

3. 隊列和棧的更多形式

隊列除了先進先出外,也有循環隊列、後進先出隊列和優先隊列。code

循環隊列通常基於循環數組,它能夠節省增刪元素時沒必要要的空間和時間浪費。htm

後進先出隊列其實就和棧實現方式同樣,從這個角度來看棧無疑也是隊列的一種。blog

優先隊列則是實現了根據入隊時的權重,出隊永遠是隊列中權重最大的那個元素,優先隊列能夠基於最大堆來實現,在數據結構這系列博文的後續,我也會專門再寫一篇最大最小堆的博文。

相關文章
相關標籤/搜索