数据结构——队列和栈

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

优先队列则是实现了根据入队时的权重,出队永远是队列中权重最大的那个元素,优先队列能够基于最大堆来实现,在数据结构这系列博文的后续,我也会专门再写一篇最大最小堆的博文。

相关文章
相关标签/搜索