栈和队列

浅谈上溢overflow和下溢underflow 目录一、为什么会出现overflow和underflow?二、解决方法 一、为什么会出现overflow和underflow? 计算机只能使用有限的bit来描述数字,因此当被描述的数字需要超多的bit位,而计算机的bit位不够时,计算机就不能准确地表示这些数字。 例如,因为计算机没有足够的bit位,所以不能描述一个极小的数 1×10−100001×10^{-10000}1×10−10000 ,计算机会认为这个数是0 。这种误把一个极小的数看作 0 的现象叫做underflow。 计算机也不能描述一个极大的数 阅读详情

一.
栈是一种特殊的线性表,特点是:后进先出(LIFO),先进栈的元素后出栈,后进栈的元素先出。基本操作:栈的初始化、判断栈空、入栈、出栈等。比如,堆放一堆书,取出来的当然是第一本了,一本书放到这个书堆也是放在最上面,当然,你要是抽出来。。。。那我也没办法
栈的存储方式有两种,一个是用数组存储,另外一种是使用链表存储。使用数组存储需要注意判断栈的上溢或者下溢。上溢:超过了数组的大小。下溢:数组中已经没有元素仍执行弹出操作。使用链表存储的时候则没有上溢这个概念,因为链表毕竟是用一个加一个节点接上去。
栈的操作:
InitStack(SqStack &S);//初始化栈
DestroyStack(SqStack &S) ;//销毁栈
ClearStack(SqStack &S);//清空栈
StackLength(SqStack S);//返回栈的长度
StackEmpty(SqStack S);//判断栈是否是空
GetTop(SqStack S, ElemType &e);//获取栈首元素
Push(SqStack &S, ElemType e);//把元素压入栈顶
Pop(SqStack &S, ElemType &e);//弹出栈首元素,并返回该值

这里写图片描述
数组栈实现代码如下:

#include <iostream>
using namespace std;
#include <malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
typedef struct {
    ElemType *base;
    ElemType *top;
    int stacksize;
}SqStack;
Status InitStack(SqStack &S)  //初始化栈,申请空间
{
    S.base = (ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
    S.stacksize = STACK_INIT_SIZE;  //栈的初始大小
    S.top = S.base;  //初始化的时候栈顶指针指向底部
    return OK;
}
Status DestroyStack(SqStack &S) //销毁栈
{
    free(S.base);
    S.base = S.top = NULL;
    S.stacksize = 0;
    return OK;
}
Status ClearStack(SqStack &S)  //清空栈
{
    S.top = S.base;
    return OK;
}
int StackLength(SqStack S)  //返回栈的长度
{
    return S.stacksize;
}
int StackEmpty(SqStack S)  //判断栈是否是空
{
    if(!S.stacksize)
    {
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}
ElemType GetTop(SqStack S, ElemType &e)  //获取栈首元素
{
    if(S.top == S.base)  
    {
        return ERROR;
    }
    else
    {
        e = *(S.top-1);
        return OK;
    }
}
Status Push(SqStack &S, ElemType e)  //把元素压入栈顶
{
    if(S.top - S.base >= S.stacksize) //判断栈是否上溢
    {
        S.base = (ElemType *)realloc(S.base,sizeof(ElemType)*(STACKINCREMENT+S.stacksize));
        if(!S.base) return OVERFLOW;
        S.top = S.base + S.stacksize;   
        S.stacksize += STACKINCREMENT;
    }
    * S.top = e;
    S.top++;
    return OK;
}
Status Pop(SqStack &S, ElemType &e) //弹出栈首元素,并返回该值
{
    if(S.base == S.top) return ERROR;  //是否下溢
    e = *(--S.top);
    return OK;
}

链栈的实现代码如下:

#include <iostream>
using namespace std;
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
typedef struct stack{
    ElemType data;
    struct stack *next;
}lkstack, *linkstack;
Status CreateStack(linkstack &S)    //创建链栈,需要使用头插法,使得头指针指向的是栈首 
{
    int len;
    cout<<"请输入要创建的栈的长度:"<<endl;
    cin>>len;
    S = (linkstack)malloc(sizeof(lkstack));
    S->next = NULL;
    for(int i = 0; i < len; i++)
    {
        linkstack p = (linkstack)malloc(sizeof(lkstack));
        cout<<"输入元素值"<<endl;
        cin>>p->data;
        p->next = S->next;
        S->next = p;
    }
    linkstack q = S->next;
    while(q)
    {
        cout<<"值为:"<<q->data<<endl;
        q = q->next;
    }
}
Status DestroyStack(linkstack &S) //销毁栈
{
    linkstack p, q;
    p = S;
    q = S->next;
    while(q)
    {
        free(p);
        p = q;
        if(!q->next)
        {
            free(q);
            break;
        }
        q = q->next;
    }
    cout<<"销毁成功"<<endl;
    return OK;
}
Status EmptyStack(linkstack S)
{
    if(!S->next)    return TRUE;
    return FALSE;
}
Status Push(linkstack &S)
{
    ElemType e;
    linkstack p = (linkstack)malloc(sizeof(lkstack));
    cout<<"请输入新插入的值"<<endl;
    cin>>e;
    p->data = e;
    p->next = S->next;
    S->next = p;
    linkstack q = S->next;
    while(q)
    {
        cout<<"值为:"<<q->data<<endl;
        q = q->next;
    }
    return OK;
}
Status Pop(linkstack &S, ElemType &e)
{
    linkstack p = S->next;
    e = S->next->data;
    S->next = S->next->next;
    free(p);
    linkstack q = S->next;
    while(q)
    {
        cout<<"值为:"<<q->data<<endl;
        q = q->next;
    }
    return OK; 
}

二.
队列也是一种特殊的线性表。特点是:先进先出(FIFO),先进队列的元素先出队列,后进队列的元素后出。基本操作:队列的初始化、判断队列空、入队列、出队列等。队列很好理解,就比如在学校里面打饭,谁排在前面,谁就先打好饭离开,后来的就到队尾。
队列也有两种存储形式:数组和链表。
数组队列也存在上溢和下溢问题,和数组栈一样的意思。队列的插入操作在队尾进行,删除操作在队首进行,这与栈不同,栈的插入和删除操作都在栈首进行。
这里写图片描述
数组队列实现代码如下:

#include <iostream>
using namespace std;
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
typedef int ElemType;
typedef int Status; 
typedef struct queue
{
    ElemType *head;
    ElemType *tail;
    int headsize;
    int tailsize;
}arrayQueue;
Status CreateQueue(arrayQueue &Q)
{
    Q.tail = (ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
    memset(Q.tail, 0, sizeof(Q.tail));
    Q.tail = Q.tail + 20;
    Q.head = Q.tail;
    Q.tailsize = 21;
    Q.headsize = 78;
    return OK;
}
Status EnQueue(arrayQueue &Q)
{
    ElemType e;
    cout<<"请输入要插入的值"<<endl;
    cin>>e;
    if(!Q.tailsize)  //判断是否上溢
    {
        cout<<"队列已满"<<endl;
    }
    else
    {
        *Q.tail = e;
        Q.tail--;
        Q.tailsize--;
    }
}
Status EmptyQueue(arrayQueue Q)
{
    if(Q.tail == Q.head) 
        return TRUE;
    return FALSE;
}
Status DeQueue(arrayQueue &Q, ElemType &e)
{
    if(EmptyQueue(Q))  //判断是否下溢
        return ERROR;
    e = *Q.head;
    Q.head--;
    Q.headsize++;
    return OK;
}

链表队列的实现后面补上。
栈的删除和插入只能在同一端进行,队列的删除和插入操作在两端进行。需要注意的是,有种比较特殊的队列,叫双端队列,插入和删除操作都可以在两端进行,既可以当成栈用,也可以当成队列用。在后面的博客会详细介绍。

栈和队列——python 一、栈 定义一个栈 栈的应用——括号匹配问题 栈的应用——迷宫问题 二、队列 自定义队列 python队列的内置模块 队列应用——打印文件后五行 队列应用——迷宫问题 python的数据结构与算法之栈与队列 阅读详情

相关推荐

栈和队列算法总结

二、栈和队列          目录:        1.设计含min函数的栈,要求min、push和pop的时间复杂度都是o(1)。        2.设计含min函数的栈的另解        3.用两个栈实现队列        4.用两个队列实现栈          5.栈的push、pop序列是否一致        6.递归反转一个栈,要求不得重新申请一个同样的栈,空间复杂

晴天的专栏 4589

C语言 数组下标越界和内存溢出区别 - C语言零基础入门教程

C语言 数组下标越界和内存溢出区别 - C语言零基础入门教程

baidu_1234567的博客 598

数组实现先进先出算法

用c++编写先进先出页面置换算法,没有用队列,用数组。

数据结构(队列)

队列是一种先进先出的线性表,只允许在队尾插入,在队头删除元素。 队列也分为顺序队列和链队列 队列的实现 队列的顺序存储结构 在队列的存储结构中,需要设置front和rear两个整形变量来分别指示队头元素和队尾元素(又称头指针和尾指针)。 typedef struct { QElemType *base;//初始化时动态分配存储空间 int front;//头指针 int rear;//尾指针 } SqQueue; 循环队列 当入队次数足够多时,我们会发现数据不能如队列了,但队列中还有剩余

m0_62292821的博客 5750

【新手流程】1小时解决Anaconda+Cuda+Cudnn+Pytorch+Pycharm深度学习环境配置

一小时速通Anaconda+Cuda+Cudnn+Pytorch+Pycharm环境配置

m0_57190453的博客 4086

Windows Server 搭建ftp服务

Windows Server 搭建ftp服务

ch258563的博客 1010

上溢和下溢

上溢和下溢的概念

XCL1670的博客 2623

从封装到先进封装:一文讲透Chiplet、2.5D/3D堆叠与系统集成

封装是芯片产业链中连接硅片与电路板的桥梁,承担物理保护、电气连接、散热与机械支撑等核心任务。传统封装从DIP、QFP发展到BGA,通过提升引脚密度满足早期性能需求。随着摩尔定律放缓,单纯缩小晶体管尺寸难以为继,先进封装应运而生,其核心理念从“封装单颗芯片”转向“系统级高密度集成”。扇出型封装、2.5D硅中介层、3D堆叠、Chiplet和系统级封装等技术,通过微米级互连和垂直堆叠,大幅提升I/O密度与带宽,成为AI芯片、HBM存储、高性能计算等领域的关键支撑。本文梳理先进封装的技术演进、分层架构与工程难点,帮

weixin_29185167的博客 366

溢出、上溢、下溢

国外著名的程序员技术网站:stackoverflow,国内对其的效仿,也有 segmentfault;overflow:溢出 overflow:上溢 underflow:下溢 stack underflow:堆栈下溢; 1. 上溢是当一个超长的数据进入到缓冲区时,超出部分被写入上级缓冲区,上级缓冲区存放的可能是数据、上一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。可见一小

1万+

爬虫实战:拆解WASM加密参数,破局2026电商动态接口反爬(实测某头部电商可用)

sign和wasm_token,而且每次请求这两个参数都在动态变化。用常规的参数拼接、MD5加密尝试还原,结果全是403;反编译前端JS,发现核心加密逻辑被打包成了.wasm,把关键参数加密、签名逻辑藏在二进制模块里,让爬虫无法直接逆向JS拿到加密规则。前后折腾了5天,从WASM文件解析、JS与WASM交互逻辑拆解,到本地还原加密参数、实战验证,踩了无数坑(比如WASM版本不兼容、内存数据读取失败、加密依赖环境缺失),最终成功还原了加密流程,稳定爬取商品详情、价格、销量等核心数据,连续运行72小时无封禁。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1913

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

yohnyang的博客 208

【栈和队列】C语言简单应用 ⌊栈和队列互相实现,循环队列⌉

栈和队列简单应用

qq_62852431的博客 2299

基于Simulink的雷达跟踪系统仿真(附源码)

此示例包含对雷达系统的基本特征进行建模的子系统。该模型是用于目标位置和速度检测的雷达系统的典型模型。该示例包括雷达脉冲发生器、射频发射器子系统、移动目标的 Simulink 表示、射频接收器和接收模块(Rx 模块)。

珞瑜的博客 3515

栈和队列简介

栈和队列是插入和删除操作受阻的线性表栈:先进后出只能插入在表尾,删除时先删最后一个元素(表尾元素)队列:先进先出只能插入在表尾,删除时先删第一个元素(表头元素)存储结构:用顺序栈或链栈存储均可,但以顺序栈更常见逻辑结构:与线性表相同,仍为一对一关系存储结构:顺序队或链队,以循环顺序队列更常见逻辑结构:与线性表相同,仍为一对一关系约定an为栈顶,a1为栈底基本操作:初始化、入栈、出栈、销毁、清空、取栈顶元素等表尾即an端称为队尾,表头即a1端,称为队头。

lhr056813的博客 1430

基于Simulink的间接功率控制的矩阵变换器

通过上述步骤,我们成功设计并实现了基于 Simulink 的间接功率控制的矩阵变换器仿真模型。该模型能够通过控制输入电流和输出电压,实现对功率的间接控制,适用于电机驱动、可再生能源系统、电力传输等领域。通过虚拟场景仿真、参数优化和性能评估,验证了系统的稳定性和高效性,并通过调整 PI 控制器参数和优化调制算法,进一步提升了系统的性能。

MHD0815的博客 296

【蓝桥杯单片机组第八届省赛】— 基于单片机的电子钟程序设计与调试

1、初赛试题 1.1 基本要求 (1)使用 CT107D 单片机竞赛板, 完成“电子钟” 功能的程序设计与调试; (2)设计与调试过程中,可参考组委会提供的“资源数据包”; (3)Keil 工程文件以准考证号命名, 完成设计后, 提交完整、 可编译的 Keil工程文件到服务器。 1.2 硬件框图 1.3功能描述 1.3.1 初始化 (1)关闭蜂鸣器、继电器等无关外...

Fanjufei的博客 3661

C# 栈和队列

/求栈的长度//判断栈是否为空//清空操作//入栈操作T Pop();//出栈操作T Peek();//取栈顶元素}//取得队列长度的属性//求队列的长度//判断对列是否为空//清空队列//入队//出队T Peek();//取队头元素。

钢铁男儿 1359

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

栈和队列特别篇:栈和队列的经典算法问题

栈和队列特别篇:栈和队列的经典算法问题(保姆级教程)

ChrisJamesljl的博客 1673

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

栈和队列的转化

栈与队列的相互转换栈和队列是两种基本的数据结构,它们在许多算法和程序中都有应用。虽然栈和队列在概念上是完全不同的,但是我们可以使用两个栈来实现一个队列,或者使用两个队列来实现一个栈。这种转换在某些情况下可能非常有用,例如,当我们的编程环境只提供了栈或队列的实现,但我们需要使用另一种数据结构时。在这篇博客中,我们将详细介绍如何使用两个栈来实现一个队列,以及如何使用两个队列来实现一个栈。我们将提供详细的代码示例,并解释每个函数的工作原理。提示:以下是本篇文章正文内容,下面案例可供参考。

xiaobai230811的博客 1550

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据结构栈和队列

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,,栈中的数据元素遵守LIFO(last in first out)的原则压栈:栈的插入操作叫做进栈/压栈/入栈,出站栈:栈的删除操作叫做出栈,

ZerO_on的博客 883

栈和队列的应用

栈和队列的题目解析

2402_82658387的博客 803

栈和队列学习总结

一、栈 1、特点及应用 先进后出。(如果会和队列先进先出记混的话,就记场景吧:弹栈弹栈,就是把最上面的最新进来的弹出去;而队列就像我们火车站排队检票出站一样,谁排在前面谁就先出去。) 应用的话,其实我们经常接触呀。比如Undo操作(就是撤销操作)就是使用的栈的思想,以及程序调用的系统栈。下面我们举一个经典的括号匹配的例子: 题目要求: 给定一个只包括...

Marmara 1万+

栈和队列算法题

在学习了栈和队列的相关概念并且在之前也实现了栈和队列,接下来我们就来试着写一些栈和队列的算法题,在这些算法题当中将会使用到之前实现的栈或者队列,栈、队列在这当中将会变为工具一样,我们就会像工具一样拿着它们去解决问题,相信通过本篇算法题的解决,你会对栈和队列有更深层次的理解,一起加油吧!

mljy.博客 1552

【Java】栈和队列

本文主要介绍了栈、队列和循环队列的基本概念与实现。同时,通过对其模拟实现进一步了解其底层实现;

qq_51914226的博客 1009

栈和队列详解

栈只允许在栈顶进行操作,即插入数据在栈顶,出数据(删除)也在栈顶。这便是栈的结构,入栈和出栈都在栈顶进行。用数组实现栈的结构如上图所示,当然上图所展示的只是静态栈的结构,静态栈还是有许多缺点的,最为严重的就是空间的浪费,所以我们使用动态顺序表来是实现栈。代码: _a为数组,由我们自己动态申请空间,_top指向栈顶,_capacity为数组的容量。代码: 这里将_top初始化为0,也有将_top初始化为-1的,他们直接的区别就在于当栈为空时,_top所指向的地方不同,_top为0时指向a[0],_to

zjxuec的博客 1006
上一篇: linux学习笔记:linux常用命令
下一篇: 电路交换、报文交换和分组交换
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值