0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你还会手写栈和队列吗栈和队列的基本实现程序说明

算法与数据结构 来源:未知 作者:易水寒 2018-11-11 11:34 次阅读

昨天跟一个CSDN上的朋友聊天,他说现在如果让他自己手写一个栈或者队列,估计都要写蛮久的,平时虽然都在用,但是都是别人封装好的集合。

确实,经典的数据结构,包括排序算法,虽然我们平时不用手写了,但是这些内功,作为开发人员来说是必须要掌握的。受此启发,我打算更一下经典数据结构和算法的系列文章。今天先从栈和队列说起。

这些东西,挤地铁时,吃饭排队时,等公交时,可以拿来看看,或者,就把它当作个下午茶吧~

我们知道,在数组中,若知道数据项的下标,便可立即访问该数据项,或者通过顺序搜索数据项,访问到数组中的各个数据项。但是栈和队列不同,它们的访问是受限制的,即在特定时刻只有一个数据项可以被读取或者被删除。众所周知,栈是先进后出,只能访问栈顶的数据,队列是先进先出,只能访问头部数据。这里不再赘述。

栈的主要机制可以用数组来实现,也可以用链表来实现,下面用数组来实现栈的基本操作:

classArrayStack{

privatelong[] a;

privateint size;//栈数组的大小

privateint top;//栈顶

publicArrayStack(int maxSize){

this.size = maxSize;

this.a =newlong[size];

this.top =-1;//表示空栈

}

publicvoid push(long value){//入栈

if(isFull()){

System.out.println("栈已满!");

return;

}

a[++top]= value;

}

publiclong peek(){//返回栈顶内容,但不删除

if(isEmpty()){

System.out.println("栈中没有数据");

return0;

}

return a[top];

}

publiclong pop(){//弹出栈顶内容,删除

if(isEmpty()){

System.out.println("栈中没有数据!");

return0;

}

return a[top--];

}

publicint size(){

return top +1;

}

publicboolean isEmpty(){

return(top ==-1);

}

publicboolean isFull(){

return(top == size -1);

}

publicvoid display(){

for(int i = top; i >=0; i--){

System.out.print(a[i]+" ");

}

System.out.println("");

}

}

数据项入栈和出栈的时间复杂度均为O(1)。这也就是说,栈操作所消耗的时间不依赖于栈中数据项的个数,因此操作时间很短。栈不需要比较和移动操作。

队列也可以用数组来实现,不过这里有个问题,当数组下标满了后就不能再添加了,但是数组前面由于已经删除队列头的数据了,导致空。所以队列我们可以用循环数组来实现,见下面的代码:

publicclassRoundQueue{

privatelong[] a;

privateint size; //数组大小

privateint nItems;//实际存储数量

privateint front;//头

privateint rear; //尾

publicRoundQueue(int maxSize){

this.size = maxSize;

a =newlong[size];

front =0;

rear =-1;

nItems =0;

}

publicvoid insert(long value){

if(isFull()){

System.out.println("队列已满");

return;

}

rear =++rear % size;

a[rear]= value;//尾指针满了就循环到0处,这句相当于下面注释内容

nItems++;

/* if(rear == size-1){

rear = -1;

}

a[++rear] = value;

*/

}

publiclong remove(){

if(isEmpty()){

System.out.println("队列为空!");

return0;

}

nItems--;

front = front % size;

return a[front++];

}

publicvoid display(){

if(isEmpty()){

System.out.println("队列为空!");

return;

}

int item = front;

for(int i =0; i < nItems; i++){

System.out.print(a[item++% size]+" ");

}

System.out.println("");

}

publiclong peek(){

if(isEmpty()){

System.out.println("队列为空!");

return0;

}

return a[front];

}

publicboolean isFull(){

return(nItems == size);

}

publicboolean isEmpty(){

return(nItems ==0);

}

publicint size(){

return nItems;

}

}

和栈一样,队列中插入数据项和删除数据项的时间复杂度均为O(1)。

还有个优先级队列,优先级队列是比栈和队列更专用的数据结构。优先级队列与上面普通的队列相比,主要区别在于队列中的元素是有序的,关键字最小(或者最大)的数据项总在队头。数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序。优先级队列的内部实现可以用数组或者一种特别的树——堆来实现。

publicclassPriorityQueue{

privatelong[] a;

privateint size;

privateint nItems;//元素个数

publicPriorityQueue(int maxSize){

size = maxSize;

nItems =0;

a =newlong[size];

}

publicvoid insert(long value){

if(isFull()){

System.out.println("队列已满!");

return;

}

int j;

if(nItems ==0){//空队列直接添加

a[nItems++]= value;

}

else{//将数组中的数字依照下标按照从大到小排列

for(j = nItems-1; j >=0; j--){

if(value > a[j]){

a[j+1]= a[j];

}

else{

break;

}

}

a[j+1]= value;

nItems++;

}

}

publiclong remove(){

if(isEmpty()){

System.out.println("队列为空!");

return0;

}

return a[--nItems];

}

publiclong peekMin(){

return a[nItems-1];

}

publicboolean isFull(){

return(nItems == size);

}

publicboolean isEmpty(){

return(nItems ==0);

}

publicint size(){

return nItems;

}

publicvoid display(){

for(int i = nItems-1; i >=0; i--){

System.out.print(a[i]+" ");

}

System.out.println(" ");

}

}

这里实现的优先级队列中,插入操作需要 O(N) 的时间,而删除操作则需要 O(1) 的时间。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4450

    浏览量

    90740
  • 程序
    +关注

    关注

    114

    文章

    3630

    浏览量

    79511
  • 数据结构
    +关注

    关注

    3

    文章

    562

    浏览量

    39898

原文标题:如果让你手写个栈和队列,你还会写吗?

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    队列以后出只有刚开始一组数出来,后续的就没有了,怎么调了?有偿

    队列以后出只有刚开始一组数出来,后续的就没有了,怎么调了?有偿
    发表于 03-13 17:06

    51单片机等串口缓存队列的C语言程序说明

    本文档的主要内容详细介绍的是51单片机等串口缓存队列的C语言程序说明资料免费下载。
    发表于 06-27 17:42 3次下载
    51单片机等串口缓存<b class='flag-5'>队列</b>的C语言<b class='flag-5'>程序</b><b class='flag-5'>说明</b>

    深度解析数据结构与算法篇之队列及环形队列实现

    对尾的位置。 02 — 环形队列实现 要想将元素放入队列我们必须知道对头和队尾,在队列长度不能无限大的条件下我们还要知道队列的最大容量,我
    的头像 发表于 06-18 10:07 1637次阅读

    RTOS消息队列的多种用途

      消息队列可以以多种不同的方式使用。事实上,您可以编写可能只使用消息队列的相当复杂的应用程序。仅使用消息队列可以减少代码的大小(即占用空间),因为可以模拟许多其他服务(信号量、时间延
    的头像 发表于 06-29 14:57 2054次阅读
    RTOS消息<b class='flag-5'>队列</b>的多种用途

    实现一个双端队列的步骤简析

    队列是非常基础且重要的数据结构,双端队列属于队列的升级。很多的算法都是基于队列实现,例如搜索中的bfs,图论中的spfa,计算几何中的me
    的头像 发表于 10-27 18:11 1080次阅读

    SystemVerilog中的队列

    队列是大小可变的有序集合,队列中元素必须是同一个类型的。队列支持对其所有元素的访问以及在队列的开始或结束处插入和删除。
    的头像 发表于 10-31 10:09 3040次阅读

    什么是消息队列?消息队列中间件重要吗?

    应用解耦:消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节。
    的头像 发表于 11-07 14:55 1026次阅读

    Free RTOS的信息队列

    队列用于在任务之间以及任务与中断之间传递数据,可以在调度程序启动之前或之后创建队列
    的头像 发表于 02-10 16:01 532次阅读
    Free RTOS的信息<b class='flag-5'>队列</b>

    嵌入式环形队列和消息队列实现

    嵌入式环形队列和消息队列实现数据缓存和通信的常见数据结构,广泛应用于嵌入式系统中的通信协议和领域。
    的头像 发表于 04-14 11:52 1048次阅读

    嵌入式环形队列和消息队列是如何去实现的?

    嵌入式环形队列和消息队列实现数据缓存和通信的常见数据结构,广泛应用于嵌入式系统中的通信协议和领域。
    发表于 05-20 14:55 664次阅读

    利用C++提供的队列封装一个消息队列

    最近的C++项目中,需要用到消息队列,但是C++中又没有原生的消息队列,就在网上找了一下相关资料,利用C++提供的队列,自己封装一个消息队列,以后的项目也可以复用。
    的头像 发表于 05-20 15:16 1096次阅读
    利用C++提供的<b class='flag-5'>队列</b>封装一个消息<b class='flag-5'>队列</b>

    单片机消息队列实现原理和机制

    单片机开发过程中通常会用到“消息队列”,一般实现的方法有多种。 本文给大家分享一下队列实现的原理和机制。
    的头像 发表于 05-26 09:50 857次阅读
    单片机消息<b class='flag-5'>队列</b>的<b class='flag-5'>实现</b>原理和机制

    RTOS消息队列的应用

    基于RTOS的应用中,通常使用队列机制实现任务间的数据交互,一个应用程序可以有任意数量的消息队列,每个消息队列都有自己的用途。
    发表于 05-29 10:49 414次阅读
    RTOS消息<b class='flag-5'>队列</b>的应用

    两个栈实现一个队列方法

    数据结构,同时也存在某种联系。用栈可以实现队列,用队列也可以实现栈。 两个栈实现一个队列 思路:
    的头像 发表于 10-08 15:54 578次阅读

    无锁队列解决的问题

    访问;CPU访问cache的速度要比访问内存要快的多;由于线程频繁切换,会造成cache失效,将导致应用程序性能下降。 阻塞引起的CPU浪费 mutex是阻塞的,在一个负载较重的应用程序中使用阻塞队列来在线程之间传递消息,会导致
    的头像 发表于 11-10 15:33 262次阅读
    无锁<b class='flag-5'>队列</b>解决的问题