算法导论之六栈与队列

算法导论 - 基于 C# 的栈和队列实现 栈和队列是两种基础且常用的数据结构。栈是一种后进先出(LIFO)的数据结构,而队列是一种先进先出(FIFO)的数据结构。通过本文档,您应能够理解栈和队列的基本原理及其在 C# 中的实现,并能够在合适的场景中应用这些数据结构。 阅读详情

1.在栈中,被删除的是最近插入的元素,其实现的是后进先出(LIFO)策略,在队列中,删除的是在集合中存在时间最长的那个元素,其实现的是先进先出(FIFO)策略。

2.可用一个数组来实现最多容纳个元素的栈,其中有一个属性,指向最新插入的元素,如果试图对一个空栈执行弹出操作,则称栈下溢,如果超过了,则称栈上溢。

3.几种栈操作的伪代码:

       STACK_EMPTY(S)

              if  = =0

                     return TRUE

              else return FALSE

 

       PUSH(S, x)

               =  +  1

              S[] = x

 

       POP(S)

              if STACK_EMPTY(S)

                     error "underflow"

              else  =  - 1

                     return S[+1]

4. 队列有队头和队尾,当有一个元素入队时,它被放在队尾的位置,而出队的元素则总是排在对头的那个。利用数组可实现最多容纳个元素的队列。属性指向队头元素,属性指向下一个新元素要插入的位置。当时,队列为空,当时,队列为满。

5. 有关队列的伪代码,省略了对下溢和上溢的检查

       ENQUEUE(Q,x)

              Q[] = x

              if ==

                      =  1

              else =  + 1

 

       DEQUEUE(Q)

              x= Q[]

              if==

                     = 1

              else= + 1

              returnx

6. 顺序栈的应用

#include <stdio.h>

#include <stdlib.h>

 

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

 

typedef int Status;  //函数返回状态

typedef char SElemType;      //栈元素类型

typedef struct

{

       SElemType*base;

       SElemType*top;

       intstacksize;

}SqStack;       //栈结构定义

 

//构造一个空栈

Status InitStack(SqStack *S)

{

       S->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

       if(!S->base)

       {

              printf("分配内存失败.\n");

              exit(0);

       }

       S->top=S->base;

       S->stacksize=STACK_INIT_SIZE;

       returnOK;

}

 

//销毁S,S不再存在

Status DestroyStack(SqStack *S)

{

       if(!S)

       {

              printf("指针为空,释放失败.\n");

              exit(0);

       }

       free(S);

       returnOK;

}

 

//将S置为空栈

Status ClearStack(SqStack *S)

{

       if(!S)

       {

              returnFALSE;

       }

       S->top=S->base;    //直接将栈顶指针指向栈底

       returnOK;

}

 

//判断S是否为空栈

Status StackEmpty(SqStack S)

{

       if(S.base==S.top)

       {

              returnTRUE;

       }

       else

              returnFALSE;

}

 

//返回栈的长度

int StackLength(SqStack S)

{

       returnS.stacksize;

}

 

//若栈不为空,则用e返回S的栈顶元素,否则返回false

Status GetTop(SqStack S,SElemType*e)

{

       if(S.top==S.base)

       {

              printf("栈为空.\n");

              returnFALSE;

       }

       else

       {

              e=S.top-1;

              printf("栈顶元素:%c\n",*e);

              returnOK;

       }

}

 

//插入元素e为新的栈顶元素

Status Push(SqStack *S,SElemTypee)

{

       //栈已满,追加存储空间

       if((S->top-S->base)>=S->stacksize)

       {

              S->base=(SElemType*)realloc(S->base,(S->stacksize+STACK_INIT_SIZE)*sizeof(SElemType));

              if(!S->base)

              {

                     printf("重新申请空间失败.\n");

                     exit(0);

              }

              S->top=S->base+S->stacksize;      //更改栈顶指针

              S->stacksize+=STACKINCREMENT;

       }

       *S->top++=(*e);

       returnOK;

}

 

//若栈S不为空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR

Status Pop(SqStack *S,SElemType*e)

{

       if(S->top=S->base)

       {

              printf("栈为空.\n");

              returnERROR;

       }

       e=--S->top;

       returnOK;

}

 

//从栈底到栈顶依次对每个元素进行访问

Status StackTraverse(constSqStack *S)

{

       SElemType*p=S->base;

       if(S->base==S->top)

       {

              printf("栈为空.\n");

              returnERROR;

       }

       printf("栈中元素:");

       while(p!=S->top)

       {

              printf("%c",*p++);

       }

       printf("\n");

       returnOK;

}

 

 

//==============交互处理===============//

void PrintMsg(){//输出操作提示信息 

       printf("--Welcome--\n"); 

       printf("请输入您要进行的操作:\n"); 

       printf("I:元素入栈\n"); 

       printf("O:元素出栈\n"); 

       printf("A:查看栈中所有元素\n"); 

       printf("C:清空栈\n"); 

       printf("T:查看栈顶元素\n"); 

       printf("L:查看栈空间\n"); 

       printf("Q:退出\n"); 

       printf("others:donothing.\n"); 

       printf(">>"); 

}

 

char getOption(){//获取用户输入操作 

       charinput; 

       scanf("%c",&input); 

       flushall(); 

       input=toupper(input); 

       returninput; 

}

SElemType getElemInput(){//获得入栈元素 

       SElemTypee; 

       printf("请输入一个字符:"); 

       scanf("%c",&e); 

       flushall(); 

       returne; 

}

 

int main() 

{ 

       charop; 

       SqStackstack;//栈 

       SElemTypee;//元素 

       PrintMsg(); 

       InitStack(&stack); 

       while(op=getOption()){ 

              if(op=='Q')//退出 

                     break; 

              switch(op){ 

              case'I'://入栈 

                     e=getElemInput(); 

                     Push(&stack,e); 

                     break; 

              case'O'://出栈 

                     Pop(&stack,&e); 

                     break; 

              case'A'://遍历栈中元素 

                     StackTraverse(&stack); 

                     break; 

              case'C'://清空栈 

                     ClearStack(&stack); 

                     break; 

              case'T'://获取栈顶 

                     GetTop(stack,&e); 

                     break; 

              case'L'://获取栈空间 

                     printf("栈空间:%d\n",StackLength(stack)); 

                     break; 

              default: 

                     break; 

              }//switch 

              printf(">>"); 

       }//while 

       printf("--Byebye--\n"); 

       return0; 

} 

 

7. 队列的应用:

#include "stdio.h"

#include "stdlib.h"

#include "io.h"

#include "math.h"

#include "time.h"

 

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define MAXSIZE 20

 

typedef int Status;

typedef int QElemType;

 

//循环队列的顺序存储结构

typedef struct

{

    QElemType data[MAXSIZE];   

    int front;        //头指针

    int rear;       //尾指针

}SqQueue;

 

Status visit(QElemType c)

{

    printf("%d",c);

   return OK;

}

 

//初始化一个空队列Q

Status InitQueue(SqQueue *Q)

{

    Q->front=0;

    Q->rear=0;

    return OK;

}

 

//将Q清为空队列

Status ClearQueue(SqQueue *Q)

{

    Q->front=Q->rear=0;

    return OK;

}

 

//若队列Q为空队列,则返回TRUE,否则返回FALSE

Status QueueEmpty(SqQueue Q)

{

    if(Q.front==Q.rear)

        return TRUE;

    else

        return FALSE;

}

 

//返回Q的元素个数,也就是队列的当前长度

int QueueLength(SqQueue Q)

{

    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;

}

 

//若队列不空,则用e返回Q的队头元素,并返回OK,否则返回FALSE

Status GetHead(SqQueueQ,QElemType *e)

{

    if(Q.front==Q.rear)

        return ERROR;

    else

        *e=Q.data[Q.front];

    return OK;

}

 

//若队列未满,则插入元素e为Q新的队尾元素

Status EnQueue(SqQueue*Q,QElemType e)

{

    if((Q->rear+1)%MAXSIZE==Q->front)

        return ERROR;

    Q->data[Q->rear]=e;

    Q->rear=(Q->rear+1)%MAXSIZE;

 

    return OK;

}

 

//若队列不空,则删除 Q中队头元素,用e返回其值

Status DeQueue(SqQueue*Q,QElemType *e)

{

    if(Q->front==Q->rear)

        return ERROR;

    else

        *e=Q->data[Q->front];

        Q->front=(Q->front+1)%MAXSIZE;

 

    return OK;

}

 

//从队头到队尾依次对队列Q每个元素输出

Status QueueTraverse(SqQueue Q)

{

    int i;

    i=Q.front;

    while((i+Q.front)!=Q.rear)

    {

        visit(Q.data[i]);

        i=(i+1)%MAXSIZE;

    }

    printf("\n");

    return OK;

}

 

int main()

{

    Status j;

    int i=0,l;

    QElemType d;

    SqQueue Q;

    InitQueue(&Q);

    printf("初始化队列后,队列空否?%u(1:空0:否)\n",QueueEmpty(Q));

 

    printf("请输入整型队列元素(不超过%d个),-1为提前结束符:",MAXSIZE-1);

 

    do

    {

        d=i+100;

        if(d==-1)

            break;

        i++;

        EnQueue(&Q,d);

    }while(i<MAXSIZE-1);

 

    printf("队列长度为:%d\n",QueueLength(Q));

    printf("现在队列空否?%u(1:空0:否)\n",QueueEmpty(Q));

    printf("连续%d次由队头删除元素,队尾插入元素:\n",MAXSIZE);

    for(l=1;l<=MAXSIZE;l++)

    {

        DeQueue(&Q,&d);

        printf("删除的元素是%d,插入的元素:%d\n",d,l+1000);

        /* scanf("%d",&d); */

        d=l+1000;

        EnQueue(&Q,d);

    }

    l=QueueLength(Q);

 

    printf("现在队列中的元素为: \n");

    QueueTraverse(Q);

    printf("共向队尾插入了%d个元素\n",i+MAXSIZE);

    if(l-2>0)

        printf("现在由队头删除%d个元素:\n",l-2);

    while(QueueLength(Q)>2)

    {

        DeQueue(&Q,&d);

        printf("删除的元素值为%d\n",d);

    }

 

    j=GetHead(Q,&d);

    if(j)

        printf("现在队头元素为:%d\n",d);

    ClearQueue(&Q);

    printf("清空队列后, 队列空否?%u(1:空0:否)\n",QueueEmpty(Q));

    return 0;

}

 

 

//其链表结构

#include "stdio.h"   

#include"stdlib.h"  

#include "io.h" 

#include "math.h" 

#include "time.h"

 

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define MAXSIZE 20 /* 存储空间初始分配量*/

 

typedef int Status;

 

typedef int QElemType; /*QElemType类型根据实际情况而定,这里假设为int */

 

typedef struct QNode    /* 结点结构 */

{

  QElemType data;

  struct QNode *next;

}QNode,*QueuePtr;

 

typedef struct            /* 队列的链表结构 */

{

  QueuePtr front,rear; /* 队头、队尾指针 */

}LinkQueue;

 

Status visit(QElemType c)

{

    printf("%d ",c);

    return OK;

}

 

/* 构造一个空队列Q */

Status InitQueue(LinkQueue *Q)

{

   Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));

    if(!Q->front)

        exit(OVERFLOW);

    Q->front->next=NULL;

    return OK;

}

 

/* 销毁队列Q */

Status DestroyQueue(LinkQueue *Q)

{

    while(Q->front)

    {

         Q->rear=Q->front->next;

         free(Q->front);

         Q->front=Q->rear;

    }

    return OK;

}

 

/* 将Q清为空队列*/

Status ClearQueue(LinkQueue *Q)

{

    QueuePtr p,q;

    Q->rear=Q->front;

    p=Q->front->next;

    Q->front->next=NULL;

    while(p)

    {

         q=p;

         p=p->next;

         free(q);

    }

    return OK;

}

 

/* 若Q为空队列,则返回TRUE,否则返回FALSE*/

Status QueueEmpty(LinkQueue Q)

{

    if(Q.front==Q.rear)

        return TRUE;

    else

        return FALSE;

}

 

/* 求队列的长度 */

int QueueLength(LinkQueue Q)

{

    int i=0;

    QueuePtr p;

    p=Q.front;

    while(Q.rear!=p)

    {

         i++;

         p=p->next;

    }

    return i;

}

 

/* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR*/

Status GetHead(LinkQueue Q,QElemType*e)

{

    QueuePtr p;

    if(Q.front==Q.rear)

        return ERROR;

    p=Q.front->next;

    *e=p->data;

    return OK;

}

 

 

/* 插入元素e为Q的新的队尾元素*/

Status EnQueue(LinkQueue*Q,QElemType e)

{

    QueuePtr s=(QueuePtr)malloc(sizeof(QNode));

    if(!s) /* 存储分配失败 */

        exit(OVERFLOW);

    s->data=e;

    s->next=NULL;

    Q->rear->next=s;    /* 把拥有元素e的新结点s赋值给原队尾结点的后继,见图中① */

    Q->rear=s;        /* 把当前的s设置为队尾结点,rear指向s,见图中②*/

    return OK;

}

 

/* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR*/

Status DeQueue(LinkQueue*Q,QElemType *e)

{

    QueuePtr p;

    if(Q->front==Q->rear)

        return ERROR;

    p=Q->front->next;        /* 将欲删除的队头结点暂存给p,见图中①*/

    *e=p->data;                /* 将欲删除的队头结点的值赋值给e */

    Q->front->next=p->next;/* 将原队头结点的后继p->next赋值给头结点后继,见图中② */

    if(Q->rear==p)        /* 若队头就是队尾,则删除后将rear指向头结点,见图中③*/

        Q->rear=Q->front;

    free(p);

    return OK;

}

 

/* 从队头到队尾依次对队列Q中每个元素输出*/

Status QueueTraverse(LinkQueue Q)

{

    QueuePtr p;

    p=Q.front->next;

    while(p)

    {

         visit(p->data);

         p=p->next;

    }

    printf("\n");

    return OK;

}

 

int main()

{

    int i;

    QElemType d;

    LinkQueue q;

    i=InitQueue(&q);

    if(i)

        printf("成功地构造了一个空队列!\n");

    EnQueue(&q,-5);

    EnQueue(&q,5);

    EnQueue(&q,10);

    printf("插入3个元素(-5,5,10)后,队列的长度为%d\n",QueueLength(q));

    printf("队列的元素依次为:");

    QueueTraverse(q);

    i=GetHead(q,&d);

    if(i==OK)

     printf("队头元素是:%d\n",d);

    DeQueue(&q,&d);

    printf("删除了队头元素%d\n",d);

    i=GetHead(q,&d);

    if(i==OK)

        printf("新的队头元素是:%d\n",d);

    ClearQueue(&q);

    printf("清空队列后,q.front=%u q.rear=%uq.front->next=%u\n",q.front,q.rear,q.front->next);

    DestroyQueue(&q);

    printf("销毁队列后,q.front=%uq.rear=%u\n",q.front, q.rear);

   

    return 0;

}

算法导论系列入门书籍算法导论 作者:禅与计算机程序设计艺术 1.简介 一、课程简介 《算法导论》是一本由布莱恩·克尼根()、艾伦·麦克法兰()、马修·卡尔曼()、约翰·霍尔巴赫()等著,英文版由J.K. Tarjan译成中文的经典计算机科学教材 阅读详情

相关推荐

《算法导论》读书笔记六:堆与优先级队列的深入解析

堆是一种特殊的完全二叉树,它的每个父节点的值都大于或等于它的子节点的值(大根堆),或小于或等于它的子节点的值(小根堆)。堆结构广泛应用于优先级队列的实现,以及其他需要优先级处理的场景中。堆分为两种主要类型:最大堆和最小堆。大根堆是一种特殊的完全二叉树,其中任何一个父节点的值都大于或等于其子节点的值。换句话说,大根堆的堆顶元素(根节点)是整个树中的最大元素,而每个子树也满足大根堆的性质。最大堆是另一种数据结构,与大根堆类似,它也遵循特定的堆性质:每个父节点的值大于或等于其子节点的值。

weixin_36231030的博客 579

大话数据结构中的代码错误-顺序循环队列的QueueTraverse()函数

疫情期间,被困家中,先来无事过一遍数据结构中的基础知识,再看《大话数据结构》中循环队列时,看到这个一段代码: /* 从队头到队尾依次对队列Q中每个元素输出 */ Status QueueTraverse(SqQueue Q) { int i; i=Q.front; while((i+Q.front)!=Q.rear) { visit(Q.data[i]); i=(i+1)%M...

Wang_PChao的博客 2357

STM32H750VBT6在Keil5下载报错?三步搞定Flash Download Failed Cortex-M7问题

本文针对STM32H750VBT6在Keil5开发环境中常见的“Flash Download Failed Cortex-M7”下载报错问题,提供了系统性的三步解决方案。核心在于理解该芯片128KB内部Flash的特殊性,并详细指导用户检查更新Device Pack、精确配置Flash下载算法地址(0x08000000, 0x20000)以及进行硬件连接验证,从而快速修复调试器与芯片间的Flash操作协议问题。

weixin_29274969的博客 480

算法导论——栈与队列

用两个栈来实现一个队列。     不包括栈与队列的具体实现,包括10-1课后练习。代码调用STL。     栈的特点是后进先出,队列的特点是先进先出。所以用两个栈实现队列只需要把在出队列时把第一个栈的元素全部压到第二个栈(第二个栈为空),这个时候第二个栈的顺序就是队列顺序也就是先进先出。以下是实现代码。#include #include using namespace std; void

qq_37457671的博客 370

手把手教你用Boot-Repair快速修复Ubuntu启动分区缺失(附详细命令行步骤)

本文详细介绍了如何使用Boot-Repair工具快速修复Ubuntu启动分区缺失问题,包括诊断、应急准备、自动修复和手动命令操作。通过grub rescue模式下的关键命令和Boot-Repair的图形界面操作,帮助用户高效解决启动分区故障,确保系统恢复正常运行。

weixin_29229989的博客 563

电源完整性之Cadence Sigrity Power SI_AC阻抗仿真

之前和大家分享过电源完整性之仿真设计原理链接: [link](https://blog.youkuaiyun.com/weixin_41808082/article/details/117065140?spm=1001.2014.3001.5501).今天接着上一篇文章总结一下电源AC阻抗的的仿真操作流程及一些simulation中的设置参数,用到的时候Cadence Sigrity 中的Power SI组件,下面开始享受仿真的快乐吧: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的Power SI

刘小同学的博客 1万+

栈和队列的数组实现—《算法导论》学习笔记之六

《算法导论》在介绍了一些排序算法以及关于它们运行的时间分析后,开始介绍一些简单的数据结构,栈,队列,表,有根树···这些是实现高级数据结构以及更多算法设计的基础知识,有一种排序算法是桶排序,可以利用链表的结构在线性时间内完成排序。   栈和队列是经常放在一块比较的两种结构,栈的特性是先进后出(FILO),而队列的特性是先进先出(FIFO)。在现实生活中可以找到很多有这两种特性的例子,笔者在此不作

Mr_Avin的博客 632

【图像拼接】源码精读:Parallax-Tolerant Unsupervised Deep Image Stitching(UDIS++)

注:Pytorch代码。【图像拼接论文精读】专栏对应文章【图像拼接】论文精读:Parallax-Tolerant Unsupervised Deep Image Stitching(UDIS++)配合对应的文章阅读,效果更佳!注:请重点关注代码段中的注释!!!有一些讲解的东西直接写在代码段的注释中了,同时多关注红色字体和绿色字体!!!我认为深度学习方法和传统方法有很多相似之处。比如:深度学习中的损失函数和传统方法中的对齐项、失真项等其实原理相同,只是求解方式不同。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 7272

顺序栈ADT实现进制转换

/* * Created by Microsoft Visual Studio 2013 * @author: Teresa * @date: 2017-10-06 * @description: 顺序栈操作 */#include <stdio.h> #include <stdlib.h> /*函数状态码*/ #define TRUE 1 //成功 #define OK 1 #define FAL

Teresa0312的博客 653

OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南——原生“龙虾”OpenClaw快速部署、问题速查与避坑指南

至此,你已经完成了从选购服务器到配置AI大脑的全过程。无论是想在云上养一只7x24小时的“龙虾”,还是在本地体验AI Agent的魅力,上述指南都提供了明确的路径。下一步,就是接入飞书、钉钉或QQ,让你的OpenClaw真正开始“干活”赚钱了 [citation:6]。

冯·诺依曼 990

java实现长短期记忆人工神经网络LSTM(附完整源码)

java实现长短期记忆人工神经网络LSTM(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1691

数据结构之栈(Stack)——C语言实现

1、栈的定义 栈(Stack)是限定仅在表位进行插入或删除操作的线性表。对栈来说,表尾端有特殊含义,称为栈顶(top),相应的,表头端称为栈底(bottom)。 我们可以把栈形象化地看成是叠砖块的过程,在一次性只能搬动一块砖块的前提下(砖块真的很重!),我们能进行的操作是:在顶部拿走一块砖块或者放下一块砖块。 砖块的放下与拿走就是我们所说的栈的进栈...

zihonggege的博客 1万+

RT-DETR改进策略【卷积层】| CVPR-2020 Strip Pooling 空间池化模块 处理不规则形状的对象 含二次创新

一、本文介绍 本文记录的是利用Strip Pooling模块优化RT-DETR的目标检测网络模型。Strip Pooling结合了长而窄的卷积核形状在一个空间维度上的长程关系捕捉能力和在另一个空间维度上的局部细节捕捉能力,有效地处理复杂的场景信息。这一机制通过采用1×N1×N1×N或N×1N×1N×1的池化核形状来适应不同的图像特征,提高模型对目标形状和分布的适应性。在场景解析网络中,Strip Pooling可以被用于提升对具有长程带状结构或离散分布目标的解析能力,特别是在复杂场景或不同对象布局条件下效果

Limiiiing的博客 580

算法导论 第10章 10.1 栈和队列

一、概念 1.栈 (1)栈实现了后进先出操作。 在栈的数组实现中,栈顶指针指向栈顶元素,插入时先修改指针再插入,删除时先取栈顶元素再修改指针。 当top[S]=0时,栈中空的。 (2)数组栈的结构: int top;//栈顶指针 int *s];//指向栈数组 (3)在栈上实现的操作 STACK-EMPTY(S)//判断栈是否为空 PUSH(S, x)            /

幸福在路上 4838

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

算法导论 使用两个队列实现一个栈

用两个队列实现一个栈1. 算法导论原题 10.1-7 Show how to implement a stack using two queues. Analyze the running time of the stack operations. 译:使用两个队列实现一个栈。分析栈操作的运行时间(这部分本博文不解答)。 2. 如何使用两个队列实现一个栈? 由于队列的方式是后进后

梦幻DUO的游戏开发之路 838

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《算法导论》笔记 第10章 10.1 栈和队列

【笔记】 栈:后进先出 LIFO 队列: 【练习】

Azarath Metrion Zinthos 944

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

《算法导论》知识点总结

《算法导论》的学习路线: 1.MIT网易公开课《算法导论》,授课老师也是《算法导论》书的作者之一。讲解的内容几乎围绕书籍,不过其中跳跃表和自组织表书中没有,并行算法和缓存参数无关算法还没看。 2.课程配套的笔记,csdn博客:MIT算法导论公开课之课程笔记,可提前看一遍熟悉一下课程内容,这样看视频有重点。 3.看《算法导论》书籍,主要看了前半部分,其中高级数据结构和算法问题选编还没看。 =====...

changfei_1995的博客 1万+

《算法导论》第三版第10章 基本数据结构 练习&思考题 个人答案

10.1 栈和队列 10.1-1 仿照图10-1,画图表示依次执行操作PUSH(S, 4)、PUSH(S, 1)、PUSH(S, 3)、POP(S)、PUSH(S, 8)和POP(S)每一步的结果,栈S初始为空,存储于数组S[1…6]中。 解: 4→41→413→41→418→41 10.1-2 说明如何在一个数组A[1…n]中实现两个栈,使得当两个栈的元素个数之和不为n时,两者都不会发生上溢。要...

张劲声的博客 2336

算法导论-栈和队列的简单实现

栈: 接口: public interface Stack { boolean isEmpty(); void clear(); T pop(); boolean push(T t); int length(); // 查看站顶元素,不执行移除 T peek(); // 返回对象位置 int search(T t); }

DK的专栏 853

算法导论第六章:堆排序与优先队列的艺术

本文是《算法导论》精讲专栏第六章,通过堆结构可视化、动态操作演示和性能对比实验,结合完整C语言实现,深入解析堆排序与优先队列的精髓。包含堆的基本操作、堆排序算法、优先队列实现以及堆在图算法中的应用,提供10个以上C语言代码实现。

SEU123WW的博客 1022

算法导论第三章:数据结构艺术与高效实现

本文是《算法导论》精讲专栏第三章,通过动态操作可视化、内存布局图解和性能对比实验,结合完整C语言实现,深入解析数据结构核心原理。包含栈、队列、链表、散列表、二叉树等完整实现,以及工程实践中的优化技巧。

SEU123WW的博客 1167

算法导论第十章总结以及课后题答案

基本数据结构 总结 都是些基础知识 课后题答案 10.1-6 说明如何用两个栈实现一个队列,并分析相关队列操作的运行时间。 假定S1和S2是两个栈,Q是一个队列。 ENQUEUE operation: ENQUEUE(Q,x) //x是要插入队列的元素 PUSH(S1,x) 就相当于在栈中插入元素,所以时间复杂度为O(1)。 DEQUEUE operation DE

wk_bjut_edu_cn的博客 2451

[算法导论]第十章《栈和队列》

1、栈和队列   栈和队列都是动态集合,且在其上进行DELETE操作所移除的元素的预先设定好的。栈规定元素是先进后出(FILO),队列规定元素是先进先出(FIFO)。栈和队列的实现可以采用数组和链表进行实现。   栈的基本操作包括入栈push和出栈pop,栈有一个栈顶指针top,指向最新如栈的元素,入栈和出栈操作操作都是从栈顶端进行的。   队列的基本操作包括入队enqueue和

Roger King的打怪练级房 1195

《算法导论3rd第十章》栈队列和链表

算法导论,第十章,栈,队列,有根树,链表,对象申请和释放

懒猫的脚印 616
上一篇: 算法导论之四矩阵乘法的Strassen算法
下一篇: 算法导论之五堆排序
mengrennwpu
博客等级 码龄15年 262粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengrennwpu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值