数组和链表实现简单的栈

手写栈(Stack):数组版与链表版的实现与比较 栈(Stack)作为一种经典的数据结构,在编程和算法学习中扮演着非常重要的角色。它的特点是,无论是表达式求值、括号匹配,还是函数调用管理,栈都是底层支撑的重要工具。本文将带你一步步手写实现栈的两种版本——,并详细分析它们的特点与适用场景。 阅读详情
//首先用数组实现,接着用c++类实现了链式栈
#include <stdio.h>
#include <stdlib.h>
//c语言数组实现简单的栈
#define MAXSIZE 100
typedef struct mystack{
    int data[MAXSIZE];
    int top;
} my_stack, *my_stack_type;
//创建一个栈,堆空间开辟内存
my_stack_type stac_creak()
{
    my_stack_type s = NULL;
    if(s = (my_stack_type)malloc(sizeof(my_stack)))
      
       { s ->top =0;
        printf("create done!\n");}
     return s;//返回指针可以,但不可以返回临时变量
}

bool is_full(my_stack_type s)

{
    if(s->top = MAXSIZE)
     return true;
    else
     return false;
}

bool is_empty(my_stack_type s)
{
    if(s ->top =0)
      return true;
    else
    return false;
}

void push_stack(my_stack_type s)
{
    if(!is_full(s))
    { printf("the stack is full\n");
     return;}
    else
    {
        printf("please input data\n");
        scanf("%d",&s->data[s->top]);
        s->top++;
    }
}
void pop_stack(my_stack_type s,int * temp)
{
    if(is_empty)
    {
        printf("the stack is empty\n");
        return;
    }
    else
    {
           s->top--;
        * temp = s->data[s->top];
        //s->top--;
    }
}

void clear_stack(my_stack_type s)
{
    free(s);
    printf("clear done!\n");
}

void print_stack(my_stack_type s)
{
    int i =s ->top-1;
    for(;i<=0;i-- )
    {
       printf("%d\t",s->data[s->top]) ;
        
    }
}

int main()
{
    int a;
    my_stack_type s =stac_creak();
   // is_full(s);
    push_stack(s);
    push_stack(s);
    push_stack(s);
    print_stack(s);
    pop_stack(s,&a);
    print_stack(s);
    
    //printf("%d\n%d\n" ,5 ,6);
    return 0;
}
#include <iostream>
#include <cstdlib>
using namespace std;
 
 struct Node
    {
        int data;
        Node *next;
    };


class Stack
{
private:
   
    Node *head;//链表的头结点
    Node *p; //链表的当前结点
    int length;//结点的长度
public:
Stack()//初始化一个空栈
    {
        head = NULL;
        length = 0;
    }
void push(int n)//入栈
    {   //创建结点
        Node *q = new Node;
        q->data = n;
if (head == NULL)//创建第一个结点
        {
            q->next = head;
            head = q;
            p = q;
        }
else
        {
            q->next = p;
            p = q;
        }
        length ++;
    }
    int pop()//出栈并且将出栈的元素返回
    {
        if (length <= 0)
        {
         abort();//跳出一个异常
        }
        Node *q;//创建一个临时结点
        int data;
        q = p;
        data = p->data;
        p = p->next;//结点下移
        delete(q);
        length --;
        return data;
    }
    int size()//返回元素个数
    {
        return length;
    }
    int top()//返回栈顶元素
    {
        return p->data;
    }
    bool isEmpty()//判断栈是不是空的
    {
        if (length == 0)
        {
       return true;
        }
       else
        {
            return false;
        }
    }
void clear()//清空栈中的所有元素
    {
        if (length > 0)
        {
            pop();
        }
    }
};
int main()
{
//以下为测试代码
    Stack s;
    s.push(1);
    s.push(2);
    s.push(3);
while(!s.isEmpty())
    {
        cout<<s.pop()<<' ';
    }
    cout << endl;
    s.push(1);
    s.push(2);
    s.push(3);
    int a =s.pop();
    
while(!s.isEmpty())
    {
        cout<<s.pop()<<' ';
    }
    
    
return 0;
}


栈ADT的三种实现方式:数组、动态数组和链表 本文探讨了栈抽象数据类型(ADT)的三种主要实现方法:简单的基于数组的实现、动态数组实现以及链表实现。每种方法都有其性能和空间复杂度特点,以及适用的场景。通过分析各自的优劣,我们可以更好地理解如何在实际编程中选择合适的栈实现。 阅读详情

相关推荐

ControlCAN.dll开发适配USBCAN_E/2E_U设备

摘要:本文提供了USBCAN_E/2E_U设备的配置指南:1)安装专用驱动;2)获取最新的ControlCAN.dll文件;3)修改VCI调用顺序,新增VCI_SetReference函数设置波特率;4)使用工具计算波特率配置值,并给出了常见波特率对应的代码参考值(如500K对应0x060007)。配置过程强调使用特定工具计算精确的波特率参数,并提供了相关软件下载链接。

weixin_43969033的博客 390

c++分别用数组和链表实现栈的操作

栈在实际编程中经常会用到,本文利用数组和链表分别实现了栈的操作。 1.数组方式实现如下: #include using namespace std; template class arraystack{ public: arraystack(); ~arraystack(); bool isempty(); void push(const T& data)

longhopefor,开启学习之路 2016

uniapp 基于单选框多选框实现上拉触底多选/单选、回显

showPickerCheckbox弹层显示 label和value 类似下拉框的label和value一个意思 键和值。结果:可以传接口(接口只能post请求) 可以搜索 下面是结果图片展示 单选多选都可以。fieldValue回显传的值 传的是字符串 数组的话[1,2]转为1,2格式传入。mode是控制的单选还是多选 true为多选默认值 其余参数 单选多选一样。fieldName字段名 确定后会返回该字段名 根据字段名找对应的传入值。问题:在uniapp上 实现分页多选的操作。下面是组件的完整代码。

2301_76607997的博客 2936

【c语言】栈(通过数组和链表实现)

栈是一种数据结构,它是一个具有特殊性质的线性表。栈中的元素遵循后进先出(LIFO,Last In First Out)的原则,也就是最后入栈的元素最先被弹出。在C语言中,栈通常是由系统分配的一段连续内存空间,它用来存储局部变量、函数参数以及函数调用的返回地址等信息。每当一个函数被调用时,系统都会为其分配一个栈帧,用来存储这些信息,然后将其压入栈中。当函数执行完毕后,系统会将栈帧弹出,恢复先前的执行状态。在C语言中,栈的操作主要包括压栈(push)、弹栈(pop)以及栈顶元素访问等。

weixin_74337975的博客 943

CAN收发器TJA1145A休眠唤醒应用

TJA1145的唤醒工作原理主要依赖于其内部的唤醒机制和外部硬件的配合,主要涉及低功耗状态、选择性唤醒功能。TJA1145是一款CAN收发器,它支持多种工作模式,包括NormalStandbySleep等。在这些模式中,Sleep模式是最低功耗状态,而Normal模式则是最活跃的状态,其中Standby模式处于两者之间,允许一定的功能操作但功耗较低。TJA1145可以通过接收特定的唤醒源从Sleep或Standby模式唤醒到Standby或Normal模式。唤醒源的检测与处理。

radix关于mcu的博客,持续更新中... 5951

HFSS仿真的后处理结果,如何根据天线表面的电流密度分布对天线进行优化?

在HFSS仿真中,天线表面的Jsurf​是最直观、最有价值的诊断工具之一。它不仅告诉你天线“能不能工作”,还能告诉你“为什么工作”以及“哪里出了问题”。

degogmy的博客 1158

C++实现栈(数组模拟)【每一步详细深入讲解,代码清晰、简单、易懂】

栈就像一个子弹匣,第一粒按进去的子弹最后一个被击发,而最后一个子弹第一个被击发。这就是栈的特点:先进后出,后进先出。入栈与出栈过程:栈需要入栈以及出栈操作; 3、入栈操作 利用数组模拟栈,每次入栈从数组后面追加,数组开头是栈底,数组末尾为栈顶。代码逻辑: 4、出栈操作 代码逻辑:判断栈是否为空不空:空:

weixin_55755506的博客 4285

点云PCL库学习-双目图像转化为点云PCD并显示

文章目录 双目视觉模型 代码实现 总结 参考文章 一、双目视觉模型 和RGBD相机主动发射光线实现测距不同,双目测距原理通过配置立体摄像头(通常由左眼相机和右眼相机两个水平放置的相机组成)来获取一对同一场景中的二维图像,再基于同一空间点在两个坐标系下的视差来计算深度。双目测距的示意图和数学表达式如下所示: 双目相机的成像示意图 上述示意图描述了一个空间点在左右两目相机中位置之间的成像关系,根据相似三角形原理可得: 其中,f和b分别为相机焦距和双目相机基线,d为空间点在两个坐标系下

weixin_41957687的博客 6948

C++数组实现栈

栈是一种先进后出的数据结构,元素只能从栈顶入栈,只能从栈顶出栈,如一组数入栈顺序为:9 8 7 6 5,则出栈顺序为:5 6 7 8 9,本文用数组实现栈。

uxlike的博客 1123

【AI技术赋能有限元分析应用实践】Abaqus有限元分析与深度学习结合20个案例与有限元分析数据来源方法说明

结合 Abaqus 和深度学习,数据的获取和处理是关键的一步。通过从仿真、实验、公开数据库或合成数据中获取数据,经过预处理后,可以将其用于训练深度学习模型。最终,将训练好的深度学习模型与 Abaqus 集成,用于材料行为预测、结构优化、非线性分析、损伤预测等任务,从而提升仿真效率和精度。

源代码杀手的博客 3213

使用 MATLAB/Simulink + Simscape Electrical + SimPowerSystems + Stateflow,构建一个多能互补微电网系统的动态响应仿真模型

本文详细介绍了使用MATLAB/Simulink构建多能互补微电网动态响应仿真模型的方法。文章从系统架构设计入手,包含光伏、风电、柴油发电机、锂电池储能等多种组件,重点讲解了建模过程、控制策略(下垂控制、PLL、SOC管理)和模式切换逻辑(Stateflow)。通过四种典型场景(负荷突增、光伏出力骤降、并网/孤岛切换、电动机启动)的仿真分析,验证了微电网在动态响应中的关键性能指标,并提出了高可靠性设计建议。该模型为微电网的稳定性分析和优化设计提供了有效工具,特别强调了储能系统在快速功率支撑中的重要作用。

amy_mhd的博客 160

数组栈的实现(C++)

栈的属性为先进后出,后进先出;故只能通过栈顶删除和插入;1.StackInit初始化。

2301_76332058的博客 196

Android影像系统架构专家面试指南

传音控股招聘影像系统架构专家,要求8年以上开发经验,5年架构设计经验,精通Android Camera开发及性能优化。该职位需负责手机影像软件架构设计、技术选型及跨平台适配,重点解决"快稳省"体验优化。面试评估聚焦三大维度:技术方面考察HAL层架构设计、多帧合成优化等能力;系统开发关注低光降噪等场景的算力平衡;团队管理侧重跨部门协作与项目交付。候选人需展现对CamX-CHI等架构的深入理解,具备量化分析性能指标的能力,并能主导旗舰机影像项目全周期落地。

郑伟强dev的专栏 943

利用模板实现简单的栈类(数组和单链表)

主要的功能是实现一个后进先出的列表,有入栈、出栈、返回大小、判空等基本功能 #pragma once using namespace std; const int MAXSIZE = 0xfff; template&lt;class type&gt; class Class_Linkstack { int top; type* my_s; int max_size; ...

weixin_37944830的博客 509

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构:栈和队列

栈和队列都是含有限制的线性表。前面的知识扎实的话实现栈和队列没有一点问题。都是顺序表和链表的其中一部分。

2301_76986069的博客 3449

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

重温四大基础数据结构:数组、链表、队列和栈

文章目录前言数组链表队列栈 前言 数组、链表、队列、栈,是数据结构中最基础的四大结构,数组和链表更是基础中的基础,后续所有复杂的数据结构都是在它们的基础上演变而来的。 本节,我们就来重温这四大结构。 数组 关于数组,大家都比较熟悉了。 它是一种线性数据结构,使用一组连续的内存空间存储一组具有相同类型的数据。 这个概念中有三个关键词:线性、连续、相同类型。 线性,表示没有分叉,任意元素的前后元素最多只有一个,同样是线性结构的还有链表、队列等。 连续,它在内存空间中的存储是连续的,不间断的,前后两个元素紧挨着

“逛丢一只鞋”的博客 2281

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java分别使用数组、单向链表和双向链表模拟栈(尚硅谷数据结构与算法的课后习题)

在使用链表模拟栈之前,先把用数组模拟栈的代码粘贴一下,如果是看过这个课程的就可以跳过这一部分了,这里就是韩老师的代码。数组也是比较简单,没看韩老师课的同学可以自己看一下代码。

qq_60587058的博客 521

数据结构之链表,使用链表实现栈以及使用链表实现队列

1、结合之前实现的链表这个数据结构,如果只对链表的头部进行增加和删除,时间复杂度是O(1)的,只对链表的头部进行查询的话,时间复杂度是O(1)的。那么,满足这样的数据结构是什么呢,就是栈,栈这种数据结构是后入先出的,或者先进后出的,只对栈的一端,就是栈顶进行操作,无论是添加元素、删除元素、查询元素,都是在栈顶进行的。所以对于链表来说,可以将链表的头部当作栈顶,用链表做为栈的底层实现来实现...

HiterCoder 645

Java栈和队列

如图可见Stack继承了Vector,Vector的大小是可以动态变化的,它和ArrayList类似,但Vector是线程安全(方法大多是同步的,在多线程环境下可以安全地访问),但在一些不需要线程安全的场景下ArrayList通常是更好的选择,它的性能更高。在单向链表中,链表的头部相当于栈顶,当进行入栈操作时,在链表头部插入一个新节点,新节点的数据就是要入栈的元素,也就成为链表的头结点(使用头插法),也就是栈顶元素,出栈操作就是删除链表的头结点。的原则储存数据,先进入的元素被压入栈底最后的数据在栈顶。

huohaiyu的博客 1155

群体数据——数组、链表、栈、队列

目录线性群体的概念数组类模板动态数组类模板程序链表的概念与结点类模板顺序访问的线性群体——链表类单链表的节点类模板在当前结点之后插入一个节点删除当前结点之后的结点链表的基本操作栈类栈的基本状态栈空栈满一般状态栈的基本操作栈类模板栈的应用队列队列的基本状态队空队满一般状态循环队列 线性群体的概念 群体是由多个数据元素组成的集合体。群体可以分为两大类:线性群体和非线性群体 线性群体中的元素按位置排列有序,可以区分为第一元素、第二元素等。 非线性群体不用位置顺序来标识元素。 线性群体中的元素次序与其逻辑位置关系

织席贩履之辈 1197

【数据结构】栈的三种实现

定义 栈是一个有序线性表,只能在表的一端(称为栈顶,top)执行插入和删除操作,最后插入的元素第一个被删除,是一种后进先出(FILO)的线性表 栈的操作 1. 主要操作 void push(int data):入栈,将数据插入栈。 int pop():出栈,删除并返回最后一个插入栈的元素 2.辅助操作 int pop():返回最后一个插入栈的元素,但不删除。 int size():...

无意呢的博客 880

c++栈的实现

最近在学习数据结构,栈在这里总结一下c++实现的栈几种方法:1.使用数组这是几种方法里面最为简单的方法,直接放代码: “` include using namespace std; template class arraystack { public: arraystack(); ~arraystack(); t peek(); t top(...

baidu_41550746的博客 1686

栈的c语言实现,选择用顺序表(数组)实现

1.栈的概念及结构 栈:一种特殊的线性表,只允许在固定的一端进行插入删除元素操作,进行插入删除一端的称为栈顶,另一端成为栈底,栈中的数据元素遵守LIFO(Last in First out)的原则 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶 出栈:栈的删除操作叫做出栈,出数据也在栈顶 1 2 3 栈底 栈顶——> 后入先出 入栈依次为12345,出栈则为54321 ...

qq_30677815的博客 1326

判断一个数组为空_如何自己实现一个栈

前言栈是一种应用广泛的数据结构,例如函数的调用就需要使用栈,其实我们在介绍《快速排序优化详解》的时候也使用到了栈结构。栈最鲜明的特点就是后进先出,一碟盘子就是类似这样的结构,最晚放上去的,可以最先拿出来。本文将介绍的是如何自己实现一个栈结构。栈的操作栈的常见操作有出栈(POP),从栈中弹出一个元素;入栈(PUSH),将一个元素压入栈中,访问栈顶元素(TOP),判断栈是否为空等。栈的实现栈是较容易实...

weixin_31608037的博客 156

HFSS螺旋线圈建模全攻略:从参数设置到仿真边界条件

电磁仿真是射频与无线系统设计的核心手段,螺旋线圈作为无线充电、NFC和RFID中的常见结构,其建模质量直接影响仿真准确性。HFSS作为高频结构仿真工具,通过几何图元与布尔运算即可构建复杂三维模型,其核心原理在于将螺旋路径参数化并利用扫掠操作生成实体。掌握半径、螺距、匝数等变量化设置,能大幅提升设计迭代效率,而空气盒尺寸、辐射边界与集总端口的合理配置,则是获得可靠S参数与场分布的关键。本文面向工程实践,从基础参数到边界条件完整拆解HFSS中螺旋线圈的建模流程,帮助工程师快速上手并规避常见仿真陷阱。

weixin_34126557的博客 550

栈的实现 java_Java栈的三种实现方式(完整版)

java什么是栈系统中的堆、栈和数据结构堆、栈不是一个概念。可以说系统中的堆、栈是真实的内存物理区,数据结构中的堆、栈是抽象的数据存储结构。栈:实际上就是满足后进先出的性质,是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈的优势是,存取速度比堆要...

weixin_42365266的博客 1146
上一篇: 二分法实现查找
下一篇: 快速排序算法的实现
runner668
博客等级 码龄11年 161粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值