数据结构——队列和栈

1. 简介

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除(出队)操作,而在表的后端(rear)进行插入(入队)操作。

栈又名堆栈,它和队列一样也是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。与先进先出队列相比,栈的运作模式是后进先出。

2.具体实现

栈和链表属于线性表,意味着它可以基于数组和链表来实现,它们和普通线性表相比只是在增加和删除元素时只能在首尾操作,我们只用提供push和pop接口,实现起来十分简单。

关于数组链表,有不明白的同学可以看我前面写的博文。

在这里我们使用原生列表来实现,实际上使用我们前面实现的动态数组和链表也是完全没有问题的。

Python:

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#:

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. 队列和栈的更多形式

队列除了先进先出外,也有循环队列、后进先出队列和优先队列。

循环队列一般基于循环数组,它可以节省增删元素时不必要的空间和时间浪费。

后进先出队列其实就和栈实现方式一样,从这个角度来看栈无疑也是队列的一种。

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

posted @ 2019-11-11 17:33  秋叶红了  阅读(426)  评论(0编辑  收藏  举报