【C语言督学训练营 第十三天】栈与循环队列的顺序实现与链式实现

news2025/1/10 17:07:02

文章目录

  • 前言
  • 栈--思想
  • 栈--代码实战
  • 队列--思想
  • 队列--代码实战
  • 真题实战!

前言

栈与队列是数据结构中最常见的数据结构之一,因其特性往往可以将问题简单化,在使用栈与队列时要牢记:栈:先进后出,队列:先进先出!,写代码时必要时刻可以增加头结点,或者末尾留空,以简化操作。本篇博客主要为了回顾一下,顺序栈,链式栈,顺序循环队列,链式循环队列。以便于后期的复习!在这里插入图片描述

可以先看一下栈与队列通常考什么:
在这里插入图片描述

栈–思想

stack: a pile of objects
翻译:一垛物品
维基百科:堆栈(英语: stack)又称为栈或堆叠
特性:先进后出 (First In Last Out)FILO
考点:主要靠顺序栈,链式栈基本不考!

在这里插入图片描述
在这里插入图片描述

栈–代码实战

顺序栈(***)重点:
顺序栈通常会设置一个栈顶数值指针top用于记录当前栈顶的位置,可以将栈顶初始位置设置到-1,当有元素入栈时使用条件++top,这样top所指的位置就是栈顶元素。出栈时使用条件top–;实现代码如下:

//
// Created by Zhu Shichong on 2023/1/9.
//
#include <stdio.h>
#include<stdlib.h>
#define MaxSize 50
#define bool int
#define true 1
#define false 0
typedef int ElemType;
//数组类型
struct myList{
    ElemType data[MaxSize];
    int top;
};
typedef struct myList myList;

bool insert_stack(myList *stack,ElemType e){
    if (stack->top==MaxSize-1){
        return false;
    }
    stack->data[++stack->top]=e;
    return true;

}
ElemType pop_stack(myList *stack){
    if(stack->top==-1){
        return false;
    }
    return stack->data[stack->top--];
}
int main() {
    myList *stack=(myList*)malloc(sizeof (myList));
    stack->top=-1;
    int a;
    for(int i;i<5;i++){
        scanf("%d",&a);
        insert_stack(stack,a);
    }
    while(stack->top!=-1){
        printf("%d ", pop_stack(stack));
    }
    printf("\n");
    return 0;
}

在这里插入图片描述

链表栈(虽不常考,但也实现了一番):

//
// Created by Zhu Shichong on 2023/1/9.
//
#include <stdio.h>
#include<stdlib.h>
#define bool int
#define true 1
#define false 0
typedef int ElemType;
//数组类型
struct myList{
    ElemType data;
    struct myList *next;
};
typedef struct myList myList;

bool insert_stack(myList *stack,ElemType e){
    myList *tail=(myList*) malloc(sizeof (myList));
    tail->data=e;
    tail->next=stack->next;
    stack->next=tail;
    return true;

}
ElemType pop_stack(myList *stack){
    if(stack->next==NULL){
        return false;
    }
    myList *p;
    ElemType e;
    p=stack->next;
    e=p->data;
    stack->next=stack->next->next;
    free(p);
    return e;
}
int main() {
    myList *stack=(myList*)malloc(sizeof (myList));
    stack->next=NULL;
    int a;
    for(int i;i<5;i++){
        scanf("%d",&a);
        insert_stack(stack,a);
    }
    while(stack->next!=NULL){
        printf("%d ", pop_stack(stack));
    }
    printf("\n");
    return 0;
}

在这里插入图片描述

队列–思想

队列(Queue)简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。FIFO

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
循环队列是队列的常考点,在解决这种问题之前只需要记住,将带有元素下标指针的判断条件与运算响应部分改为(font+1)%MaxSize,或者(tail+1)%MaxSize即可!

在这里插入图片描述

在这里插入图片描述
在此,我也进行了顺序循环队列的实现:

队列–代码实战

//
// Created by Zhu Shichong on 2023/1/9.
// 循环链表队列
//
#include <stdio.h>
#include<stdlib.h>
#define MaxSize 6
#define bool int
#define true 1
#define false 0
typedef int ElemType;
//数组类型
struct myList{
    ElemType data[MaxSize];
    int font;
    int tail;
    int maxsize
};
typedef struct myList myList;

//这样写,最后一个位置是留空的
bool push_queue(myList *tail,ElemType e){
    if((tail->tail+1)%tail->maxsize==tail->font){
        return false;
    }
    tail->data[tail->tail]=e;
    tail->tail=(tail->tail+1)%tail->maxsize;
    return true;
}
ElemType pop_queue(myList *queue){
    if(queue->tail==queue->font){
        return false;
    }
    ElemType e;
    e=queue->data[queue->font];
    queue->font=(queue->font+1)%queue->maxsize;
    return e;
}
int main() {
    myList *queue=(myList*)malloc(sizeof (myList));
    queue->font=queue->tail=0;
    queue->maxsize=MaxSize;
    ElemType a;
    for(int i=0;i<5;i++){
        scanf("%d",&a);
        push_queue(queue,a);
    }
    for(int i=0;i<3;i++){
        printf("%d ", pop_queue(queue));
    }
    printf("\n");
    for(int i=0;i<5;i++){
        scanf("%d",&a);
        push_queue(queue,a);
    }
    while(queue->font!=queue->tail){
        printf("%d ", pop_queue(queue));
    }
    printf("\n");
    return 0;
}

在这里插入图片描述

真题实战!

顺序循环队列是常考的内容,但是链式循环队列也会考,就像文章开头那道19年的题,虽然没有让写代码,只让写思路,但是有了思路写代码就会很快,会写代码思路就很清晰,所以下面代码对链式循环队列进行了实现!
在这里插入图片描述
(1)该队列应选择链式存储结构(涉及到空间开辟)。
(2)初始状态,一个头节点指向自己,队空时:head==tail,队满时:tail->next==head
(3)第一个元素入队后 head->tail(存第一个元素数据)->head
(4)基本操作过程如下:

//
// Created by Zhu Shichong on 2023/1/9.
// 循环链表队列
//
#include <stdio.h>
#include<stdlib.h>
#define bool int
#define true 1
#define false 0
typedef int ElemType;
//数组类型
struct myList{
    ElemType data;
    struct myList *next;
};
typedef struct myList myList;

bool push_queue(myList **queue,myList **tail,ElemType e){
    if((*tail)->next==*queue){
        (*tail)->data=e;
        myList *p=(myList*) malloc(sizeof (myList));
        p->next=*queue;
        (*tail)->next=p;
        (*tail)=p;
        printf("malooc!!!\n");
    }else{
        (*tail)->data=e;
        *tail=(*tail)->next;
    }
    return true;

}
ElemType pop_queue(myList **queue,myList **tail){
    if(*queue==*tail) {
        return false;
    }
    ElemType e;
    e=(*queue)->data;
    (*queue)=(*queue)->next;
    return e;
}
int main() {
    myList *tail,*queue=(myList*)malloc(sizeof (myList));
    queue->next=queue;
    tail=queue;
    int a;
    for(int i=0;i<5;i++){
        scanf("%d",&a);
        push_queue(&queue,&tail,a);
    }
    for(int i=0;i<3;i++){
        printf("element out:%d\n", pop_queue(&queue,&tail));
    }
    for(int i=0;i<5;i++){
        scanf("%d",&a);
        push_queue(&queue,&tail,a);
    }
    printf("\n");
    return 0;
}

在这里插入图片描述


在这里插入图片描述


今天的内容就到此结束了,后续复习数据结构的时候估计会对栈与队列进行详细的总结!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/515133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逆向练习及相关总结

文章目录 crakeme练习crackme1crackme2crackme3 解题步骤总结关键代码查找方法常见代码C类对象逆向分析C虚函数逆向分析 crakeme练习 crackme1 学到的知识点&#xff1a; main函数查找方法&#xff1a;运行到EntryPoint -> 第一个call&#xff08;一般在第三行&#xff09…

如何用u盘重装系统win7

​如今的U盘重装win7系统是比较常见的重装win7系统的方法&#xff0c;适用性比较高&#xff0c;操作也十分的简单。有的小伙伴想给自己的电脑重装win7&#xff0c;那么我们用u盘重装系统怎么安装win7?现在小编就来教大家如何用u盘重装系统教程。 工具/原料&#xff1a; 系统…

CTR预估之FMs系列模型:FM/FFM/FwFM/FEFM

前言 ctr预估&#xff08;点击率&#xff0c;click-through rate, CTR&#xff09;&#xff0c;指一个user在某个特定的场景下会点击一个item的概率估计&#xff0c;这里的item可以是广告、商品等&#xff0c;是推荐和广告系统中十分重要的模块。另外&#xff0c;这里的user-i…

《程序员面试金典(第6版)》面试题 16.18. 模式匹配(暴力破解 + 剪枝)

题目描述 你有两个字符串&#xff0c;即pattern和value。 pattern字符串由字母"a"和"b"组成&#xff0c;用于描述字符串中的模式。 例如&#xff0c;字符串"catcatgocatgo"匹配模式"aabab"&#xff08;其中"cat"是"a&q…

Redis基础复习

1 Redis基础概述 Redis 是C语言开发的一个开源高性能键值对的内存数据库&#xff0c;可以用来做数据库、缓存、消息中间件等场景&#xff0c;是一种NoSQL(not-only sql,非关系型数据库)的数据库 1.1 参考网站&#xff1a; 官网 中文文档 1.2 安装 linux安装Redis7 1.3 Re…

全新上线!能源行业大型的S/4升级项目——E.ON(意昂)第五次迁移成功完成

意昂集团是一家德国能源集团的控股公司&#xff0c;总部位于埃森。该公司主要活跃在能源网络、能源服务、可再生能源以及德国核电站的运营和退役领域。 意昂于2019年启动了全公司范围内的S/4联合项目&#xff0c;这是SAP大型S/4项目之一&#xff0c;也是能源行业的大型S/4项目。…

linux下mysql如何修改密码,包括本地密码和远程密码。navicat远程登录

当服务器部署mysql,navicat远程访问&#xff0c;修改密码时需要修改两次 1、修改本地登录密码 mysql > SET PASSWORD PASSWORD(123456); mysql > FLUSH PRIVILEGES;重启mysql服务 service mysql restart上面命令如果报错&#xff0c;则采取以下方法&#xff1a; [ro…

SpringBoot基础篇2(整合第三方技术)

一、SpringBoot整合Junit 直接配置的module&#xff0c;默认就可以测试。 SpringBoot整合第三方技术&#xff1a; 1.pom.xml中引入对应的starter&#xff08;有勾选的勾选&#xff0c;没有勾选的选项手动导入。在这里查 查依赖的网站&#xff09; 2.配置相关信息 二、SpringB…

vue diff算法与虚拟dom知识整理(6) 感受diff算法 (不要神话虚拟dom更不要做完美主义)

我们还是打开之前的案例 然后 将src下的index.js代码修改如下 import {init,classModule,propsModule,styleModule,eventListenersModule,h,} from "snabbdom";//创建patch函数const patch init([classModule,propsModule,styleModule,eventListenersModule]);//创…

tcp 三次握手和四次挥手报文分析

1&#xff0c;tcp 三次握手 报文抓取如下&#xff1a; 三段报文分析&#xff1a; 第一次&#xff1a;26->96报文交互 Seq-num 567391014, ACK_NUM 0; flags SYN 第二次&#xff1a;96->26报文交互 Seq-num 416352681, ACK_NUM Seq-num 1 567391014 1 567391015,…

硬件系统工程师宝典(22)-----电容、电感的特性,你都知道吗?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到做电阻选型时要考虑阻值、功率、精度和封装大小。上下拉电阻除了给引脚一个稳定的电平&#xff0c;可以提高电压准位、增加输出功率以及…

法律 法规

第八章、法律 法规 从所涉及的法律法规角度 1️⃣著作权法 2️⃣计算机软件保护条例 3️⃣商标法 4️⃣专利法 从试题考点分布的角度 1️⃣保护期限 2️⃣知识产权人确定 3️⃣侵权判断 中国公民、法人或者其他组织的作品&#xff0c;不论是否发表&#xff0c;都享有著作…

Linux服务安装node,npm与yarn

目录 Linux服务安装node&#xff0c;npm与yarn 可以直接在win或者Linux安装node官网&#xff08;中文版&#xff09;下载所需要的版本 通过epel 的来安装 node 安装npm 利用npm安装yarn 卸载yarn 安装依赖 运行 本篇文章仅是本人遇到的问题&#xff0c;希望可以对你有帮…

基于海鸥算法优化的核极限学习机(KELM)分类算法-附代码

基于海鸥算法优化的核极限学习机(KELM)分类算法 文章目录 基于海鸥算法优化的核极限学习机(KELM)分类算法1.KELM理论基础2.分类问题3.基于海鸥算法优化的KELM4.测试结果5.Matlab代码 摘要&#xff1a;本文利用海鸥算法对核极限学习机(KELM)进行优化&#xff0c;并用于分类 1.KE…

Go基础知识入门

1、go语言介绍 2、go开发环境搭建 2.1、go的安装 go下载地址&#xff1a;All releases - The Go Programming Language&#xff0c;windows选择下载go1.20.2.windows-amd64.msi文件。 双击go1.20.2.windows-amd64.msi&#xff0c;点击"Next"&#xff0c;然后勾选同…

Linux——进程信号1

信号和信号量是俩个东西&#xff0c;俩者无关系。 信号 信号本质是一种通知机制&#xff0c;用户or操作系统通过发送一定的信号&#xff0c;通知进程&#xff0c;某些事件已经发送&#xff0c;让进程进行后续处理。 结合进程&#xff0c;信号结论&#xff1a; 进程要处理信号&a…

【Windows线程开发】线程基础

本篇文章来带领大家了解Windows线程&#xff0c;了解线程的基本概念&#xff0c;了解线程的创建方式&#xff0c;以及一些简单的线程操作。 文章目录 一.线程基本概念二.创建线程三.线程实例&#xff08;单线程&#xff0c;多线程&#xff09;单线程执行多线程执行 四.挂起&am…

ElasticSeach 集成 springboot

声明是ElasticSearch? ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c; 基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是 当前流行的企业级搜索引擎…

大数据 | (五)通过Sqoop实现从MySQL导入数据到HDFS

知识目录 一、前言二、导入前的准备2.1 Hadoop集群搭建2.2 Hadoop启停脚本 三、docker安装MySQL四、安装Sqoop4.1 Sqoop准备4.2 Sqoop连接Mysql数据测试 五、导入MySQL数据到hdfs5.1 准备MySQL数据5.2 导入数据 六、Sqoop现状七、结语 一、前言 各位CSDN的朋友们大家好&#x…

5.11组会衍生总结:train/eval/BN、CNN与特征图、极大似然与EM、方差n与n-1(有偏估计/无偏估计)

目录组会问题:1.关于模型的train/eval与batchnorm1-1.理论1-2.实际运用(包含loss反向传播)2.CNN详解,特征图是什么CNN处理过程特征图(也叫通道)(num_features)总结(包含CNN图片的规律分析):3.极大似然估计与EM最大期望4.方差的n与n-1(有偏估计与无偏估计) 组会问题:…