首页 > 其他 > 详细

栈与队列

时间:2021-05-10 00:26:17      阅读:24      评论:0      收藏:0      [点我收藏+]

与向量和列表一样,栈(stack)和队列(queue)保存的数据对象之间也具有线性次序,他们也属于线性序列结构。相对于一般的序列结构,栈与队列的数据操作对象仅限于逻辑上的特定某端。然而得益于其简洁性与规范性,它们既成为构建更复杂、更高级数据结构的基础,同时也是算法设计的基本出发点,甚至常常作为标准配置的基本数据结构以硬件形式直接实现。

相较于向量和列表,栈与队列的外部接口更为简化和紧凑,故亦可视作向量与列表的特例,借助于C++的继承与封装机制,可以轻松实现这两种数据结构。

栈中把可操作的一端叫做栈顶,而另一无法操作的盲端叫做栈底。对栈可行的操作只能在栈顶进行,由此不难看出栈中元素接受操作的次序必然始终遵循所谓后进先出(last-in-first-out, LIFO)的规律,即更早(晚)入栈的元素更晚(早)出栈。

 1 template<typename T>
 2 class Stack : protected Vector<T>
 3 {
 4 public:
 5     void push(const T& e)
 6     {
 7         this->insert(e);
 8     }
 9     void pop()
10     {
11         this->remove();
12     }
13     T& top()
14     {
15         return (*this)[size() - 1];
16     }
17     size_t size()const
18     {
19         return Vector<T>::size();
20     }
21     bool empty()const
22     {
23         return Vector<T>::empty();
24     }
25 };

以上便是基于已经实现的向量结构通过派生实现的栈数据结构。

push、pop分别是入栈、出栈操作,top返回栈顶元素的引用,size返回栈内元素个数,empty判断栈是否为空。

 

队列

与栈一样,队列(queue)中的元素也按线性的逻辑次序排列。队列结构同样支持对象的插入和删除,但两种操作的范围分别被限制于队列的两端——若约定新对象只能从某一端插入其中,则只能从另一端删除已有的元素。允许取出元素的一端称作队首,而允许插入元素的一端称为队尾。元素的插入与删除是修改队列结构的两种方式,站在被操作对象的角度,则分别称入队和出队。由此可以看出,与栈结构恰好相反,队列中各对象的操作次序遵循所先进先出(first-in-first-out,FIFO)的规律:更早(晚)入队者,更早(晚)出队。

与栈结构一样,队列也同样可以借由列表或向量实现。以下是基于已经实现的列表结构实现的队列结构。

template<typename T>
class Queue:protected List<T>
{
public:
    size_t size()const
    {
        return List<T>::size();
    }
    bool empty()const
    {
        return List<T>::empty();
    }
    void push(const T& e)
    {
        this->push_back(e);
    }
    void pop()
    {
        this->pop_back();
    }
    T& front()
    {
        return List<T>::front();
    }
    T& back()
    {
        return List<T>::back();
    }
};

push、pop分别是入队、出队操作,front、back分别返回队首、队尾元素的引用,size返回队列内元素个数,empty判断队列是否为空。

栈与队列

原文:https://www.cnblogs.com/sxzh/p/14749128.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!