NOIP-数据结构2
这次我们介绍线性表栈和队列。
栈:栈在我们日常的程序中也十分常见,在我们的函数调用中,栈充当了一个很重要的数据结构,在系统维护的栈中保存了各个函数执行完后应该返回的位置,既然它这么厉害既让我们看看他究竟是什么吧。栈又叫先进后出表,它能够将先进入栈中的元素“压”在后进入栈中的元素的下面,只有将压在一个元素上面的元素都弹出栈时,才能够将这个元素弹出栈。
下面我们看一个入栈和出栈的具体例子了解一下这个数据结构:
这个数据结构十分简单,我们可以分别使用数组和链表对这个结构进行实现。
数组的实现方式,我们维护一个栈的顶端的下标p,每次将一个数据压入栈中,我们可以将p+1,并把这个数据存入下标为p+1的位置。每次将一个数据从栈中弹出,由于我们只会弹出栈的顶端的数据,所以我们只需要将p位置的数据取出,再将p减一就好了。
对于链表的实现方式我们只需要保存一个指针指向栈顶的数据,每个数据的指针都指向在他前面被压入栈中的数据就完成了。对于入栈我们只需要将要插入的数据的指针指向当前的栈顶指针所指向的数据,再将栈顶指针指向这个数据就完成了。对于出栈操作则只需要将当前栈顶指针所指向的数据拿出来,再将栈顶指针指向这个数据的指针所指向的数据就完成了。
对于栈的这样的一个存储和管理数据的结构,每一个入栈和出栈的操作都是常数时间的。从此我们也能够看到这个数据结构的高效性。
了解了栈结构,大家可以自己尝试着做一下tyvj1043 表达式计算4,有困难的同学可以先从表达式计算1开始入手。
介绍完栈,我们再来看看另外一种线性表队列,就像我们平时食堂买饭一样,我们会有序的排成一个队列,先到的同学排在前面,后到的同学排在后面,前面的同学买完饭就会离开队列。我们所说的数据结构中的队列就是这么一个模型,先到的数据进入队列,也会先从队列中被取出,后到的数据后进入队列,也后从队列被取出。我们也通过一个简单的例子看看这个数据结构具体的工作方式。
同样这个数据结构也不是很难,我们也都能够用数组和链表分别实现出来
对于数组的实现,我们需要维护两个下标位置一个是队列的头一个是队列的末尾,假设我们分别用h和t表示。对于将一个数据加入队列,我们需要将t+1,并把这个数据加入下标为t+1的位置中。对于出队操作,由于我们只会从队头出队,所以我们只需要将s下标的数据取出再将s+1就完成了出队操作。
对于链表实现,我们同样需要维护两个指针分别指着队头的数据和队尾的数据,队列中的数据的指针都指向在队列中他的下一个元素。对于入队操作。我们只需要将尾指针所指向的数据的指针指向要入队的数据,再讲尾指针指向要入队的数据,这个数据就入队完成了。对于出队的操作只需要将头指针指向头指针所指向的数据的指针所指向的数据就完成了。这些文字看起来比较的绕,我们用一个图来解释一下吧。
队列的入队操作:
队列的出队操作:
NOIP信息学视频地址
视频地址
链接:https://pan.baidu.com/s/1tHo1DFMaDuMZAemNH60dmw
提取码:7jgr