首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用c实现的堆栈推送函数,使用双向链表实现。

堆栈(Stack)是一种常见的数据结构,它遵循先进后出(Last In First Out,LIFO)的原则。堆栈推送函数是指向堆栈中添加元素的操作。

使用C语言实现堆栈推送函数可以通过双向链表来实现。双向链表是一种链表结构,每个节点除了包含指向下一个节点的指针外,还包含指向前一个节点的指针。

以下是一个使用C语言实现堆栈推送函数的示例代码:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

// 定义双向链表节点结构
typedef struct Node {
    int data;
    struct Node* prev;
    struct Node* next;
} Node;

// 定义堆栈结构
typedef struct Stack {
    Node* top;
} Stack;

// 初始化堆栈
void initStack(Stack* stack) {
    stack->top = NULL;
}

// 推送元素到堆栈
void push(Stack* stack, int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->prev = NULL;
    newNode->next = stack->top;

    if (stack->top != NULL) {
        stack->top->prev = newNode;
    }

    stack->top = newNode;
}

// 示例代码的主函数
int main() {
    Stack stack;
    initStack(&stack);

    // 推送元素到堆栈
    push(&stack, 1);
    push(&stack, 2);
    push(&stack, 3);

    // 打印堆栈中的元素
    Node* currentNode = stack.top;
    while (currentNode != NULL) {
        printf("%d ", currentNode->data);
        currentNode = currentNode->next;
    }

    return 0;
}

上述代码中,我们定义了一个双向链表节点结构(Node),其中包含了数据(data)、指向前一个节点的指针(prev)和指向下一个节点的指针(next)。然后,我们定义了一个堆栈结构(Stack),其中只包含了指向堆栈顶部节点的指针(top)。

在初始化堆栈函数(initStack)中,我们将堆栈的顶部指针设置为NULL。在推送函数(push)中,我们首先创建一个新的节点,并将其数据设置为要推送的数据。然后,我们将新节点的prev指针设置为NULL,next指针设置为当前堆栈的顶部节点。如果堆栈不为空,则将当前堆栈顶部节点的prev指针设置为新节点。最后,将堆栈的顶部指针更新为新节点。

在示例代码的主函数中,我们首先初始化堆栈,然后推送三个元素到堆栈中。最后,我们遍历堆栈中的元素,并打印它们的值。

堆栈推送函数的应用场景包括但不限于:表达式求值、函数调用栈、浏览器的前进后退功能等。

腾讯云提供了云计算相关的产品和服务,其中包括云服务器(CVM)、云数据库(CDB)、云存储(COS)等。您可以访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于这些产品的详细信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 链表双向链表实现

    前言 ---- 链表数据通过指针连接,添加、插入或删除节点只需要修改指针指向 实现思路 实现一个链表需要具备以下方法 在链表尾部添加节点 获取链表所有节点数据 链表指定位置插入元素 获取链表指定位置节点数据...获取节点在链表位置 更新链表指定位置数据 移除链表指定位置节点 移除链表指定节点 判断链表是否为空 获取链表长度 链表内部需要定义head指针和链表长度 实现代码 定义head指针和length...(linkedList.size()) 双向链表 双向链表指针是双向,前指针指向上一个节点,后指针指向下一个节点 head指向第一个节点,tail指向最后一个节点 双向链表实现思路 需要具备以下方法...尾部插入元素 任意位置插入元素 获取所有节点数据 正向遍历链表获取节点数据 反向遍历链表获取节点数据 获取指定位置节点数据 获取指定数据在链表位置 更新指定位置节点数据 移除指定位置节点 移除指定数据节点...判断链表是否为空 获取链表长度 定义head和tail分别指向第一个节点和最后一个节点 代码实现 /** * 双向链表 */ function DoublyLinkedList() { //指向第一个节点

    70540

    双向链表优雅实现

    文中涉及代码可访问 GitHub:https://github.com/UniqueDong/algorithms.git 上次我们说了「单向链表代码实现,今天带大家一起玩下双向链表双向链表节点比单项多了一个指针引用...双向链表就像渣男,跟「前女友」和「现女友」,还有一个「备胎』都保持联系。前女友就像是前驱节点,现女友就是 「当前 data」,而「next」指针就像是他套住备胎。...使用这样数据结构就能实现「进可攻退可守」灵活状态。 接下来让我们一起实现『渣男双向链表』。...定义好渣男节点后,就开始实现我们双向链表。...删除指定数据 这里判断下数据是否是 null , 从头节点开始遍历链表,当找到索要删除节点时候调用用前面封装好 unlink 方法实现删除。

    81530

    TencentOS-tiny中双向循环链表实现使用

    什么是双向循环链表 双向链表也是链表一种,区别在于每个节点除了后继指针外,还有一个前驱指针,双向链表节点长下面这样: [c7p68g2ngv.png] 由这种节点构成双向链表有两种分类:按照是否有头结点可以分为两种...本文讨论是不带头节点双向循环链表,如下图: [qowp0vrk7c.png] 2. 双向循环链表实现 TencentOS-tiny中双向链表实现在tos_list.h中。 2.1....双向链表初始化 链表初始化实现如下: void tos_list_init(k_list_t *list) { list->next = list; list->prev = list...双向链表使用示例 3.1. 实验内容 本实验会创建一个带有10个静态结点双向链表,每个新自定义节点中有一个数据域,存放一个uint8_t类型值,有一个双向链表节点,用于构成双向链表。 3.2....] 新建一个任务用来测试,编写如下任务入口函数: #define LIST_LEN 10 void double_list_test(void *args) { int i; /* 用于挂载自定义节点中双向节点

    1.1K1313

    C语言】链表使用链表实现原理

    链表是什么? 1.逻辑结构上⼀个挨⼀个数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相 反,数据随机分布在内存中各个位置,这种存储结构称为线性表链式存储。...2.由于分散存储,为了能够体现出数据元素之间逻辑关系,每个数据元素在存储同时,要 配备⼀个指针,⽤于指向它直接后继元素,即每⼀个数据元素都指向下⼀个数据元素 ** 本身信息,称为“数据域”...下面是一个单链表实现过程 #include #include #include //结构体是⼀种⼯具,⽤这个⼯具可以定义⾃⼰数据类型 typedef struct...Student Stu; struct tagNode *pNext; } Node; //定义链表第...⼀个学⽣,即学⽣单链表头结点 Node *head = NULL; void printfNode() //遍历元素

    99410

    Go实现双向链表 | Redis 队列实现

    本文介绍什么是链表,常见链表有哪些,然后介绍链表这种数据结构会在哪些地方可以用到,以及 Redis 队列是底层实现,通过一个小实例来演示 Redis 队列有哪些功能,最后通过 Go 实现一个双向链表...、list-max-ziplist-value)来选择是哪种实现方式 在数据量比较少时候,使用双端链表和压缩列表性能差异不大,但是使用压缩列表更能节约内存空间 redis 链表实现源码 redis...这里了解到 Redis 列表是怎么使用,下面就用 Go 语言实现一个双向链表实现这些功能。...3、Go双向链表 3.1 说明 这里只是用 Go 语言实现一个双向链表实现:查询链表长度、链表右端插入数据、左端取数据、取指定区间节点等功能( 类似于 Redis 列表 RPUSH、LRANGE...,介绍链表是有哪些(单向链表双向链表以及循环链表),也介绍了链表应用场景(Redis 列表使用链表作为底层实现),最后用 Go 实现双向链表,演示了链表在 Go 语言中是怎么使用,大家可以在项目中更具实际情况去使用

    1.3K51

    循环链表实现_建立双向循环链表

    循环链表   循环链表是一个收尾相接链表,将单链表最后一个指针域改由NULL改为指向表头结点这就是单链式循环链表,并称为循环单链表   带头结点循环单链表各种操作算法实现与带头结点单链表算法实现类似...单链表判别条件为p!=NULL或p->next!=NULL,而单循环链表判别条件是p!=L或p->next!=L   在循环单链表中附设尾指针有时候比附设头指针更简单。...如:在用头指针循环单链表中找a1时间复杂度是O(1),找an需要从头找到尾,时间复杂度是O(n),如果用为指针rear,找开始结点和终端结点存储位置分别是rear->next->next和rear...    方法一:先找到两个链表LA,LB表尾,分别用p,q指向它,然后将第一个链表表尾与第二个链表第一个结点连起来,修改第二个表尾q,使它链域指向第一个表头 //头指针合并循环链表 #include...;//返回新链表尾指针 }   循环链表求长度 #include #define len sizeof(Node) #include typedef struct

    74920

    使用线程安全型双向链表实现简单 LRU Cache 模拟

    使用线程安全型双向链表实现简单 LRU Cache 模拟 目录 博主介绍 前言 1、动机 1.1、要解决问题 2、系统设计 2.1、系统总体框架 2.2、系统功能模块 2.3 系统整体流程 3、数据结构设计...擅长C#、Java、机器视觉、底层算法等语言。2019年成立柒月软件工作室。 前言 ​ 双向链表是计算机内一种重要数据结构。...使用 Golang 及其提供标准库,实现整个系统全部功能。 数据结构层:使用传统双向链表结构,每个链表节点带一个前驱指针与后继指针。...函数名称 介绍 Clone() 复制一个一模一样双向链表 Connect() 连接两个链表 LRU() 使用该数据结构实现 LRU 缓存调度算法 2.3 系统整体流程 下方是流程图描述使用该数据结构实现...Clone():复制链表。 Connect():连接两个链表。 ​ 应用封装层为使用上述基础方法进一步实现常用功能。因此其具有线程安全特性。

    78210

    双向链表类模板实现

    全部代码加详细注释 List.hpp写法1----将迭代器类,节点类和链表类分开写,变量不统一,书写较麻烦 /***************Node结点定义************/ template...} //******************************************************************* }; /***************链表类模板定义...begin和end函数里面使用 //开始迭代器---返回迭代器已经可以间接操作head->next即第一个有效节点位置 //注意这里返回都是临时匿名迭代器对象 iterator...模板变量参数统一化,便于书写 #pragma once #include #include using namespace std; /***************链表类模板定义...begin和end函数里面使用 //开始迭代器---返回迭代器已经可以间接操作head->next即第一个有效节点位置 //注意这里返回都是临时匿名迭代器对象 iterator

    98410

    C# 算法之链表双向链表以及正向反向遍历实现

    1、简介 链表是一种非常基础数据结构之一,我们在日常开发种都会接触到或者是接触到相同类型链表数据结构.所以本文会使用C#算法来实现一个简单链表数据结构,并实现其中几个简单api以供使用. 2、概述...链表是一种递归数据结构,他或者为null,或者是指向像一个节点(node)引用,该节点含有一个泛型元素(当然可以是非泛型,但是为了充分利用C#优势,切让链表更具有灵活性,这里使用泛型)和指向另一个链表引用.... 3、实战 单向链表 如下图,因为下一个节点对象没有保持上个节点引用,所以这种链表称之为单向链表 实现代码如下,这边我使用了迭代器模式,方便节点单向遍历,因为没有使用MS提供标准迭代器接口,...,比如RedisList就是使用双向链表实现.这种形式链表更加灵活....,实现反向遍历功能是不可能,实际上RedisList是实现了这个功能,所以这里我也实现下,tip:目前为止,所以遍历都是先进先出,类似于队列,所以如果实现了反向遍历,从而该双向链表同时也支持了先进后出功能

    55930

    单循环链表-带头双向循环链表实现

    今天我们就来学习一下结构最复杂带头双向循环链表!!!...;   虽然名字听上去比较复杂单循环链表,但是实现起来比单链表(全名:不带头、不循环、单向链表)更加简单,也不需要过多考虑特殊情况;   两种链表比较:(上面是单链表,下面是带头双向循环链表)   结构分析...  首先链表头节点是不存储有效数据(该节点被称为哨兵位),其次我们只需要知道改头节点指针就能找到整个链表单循环链表,并且便于对整个链表进行维护;   当然既然是双向嘛,那节点一定有个指针域指向前一个节点...链表为空:   就是:   head->next=head;   head->prev=head;   链表基本操作实现 创建节点    ListNode* ListCreate(LTDataType...、这两个接口就能快速实现出带头双向循环链表了;   总代码及头文件   头文件包含:    #pragma once #include #include #include

    60630

    双向链表三种实现

    这篇文章,其实很像是“茴字四种写法”。这让人不由想起来孔乙己。在我印象中,大多数人对孔乙己是持嘲讽态度。 但是从技术上讲,我觉得”茴字四种写法”在满足需求前提下,有助于我们简化实现。...在我历史经验中,我一共写过三种双向链表。 在最开始实现时,就是按算法导论最朴素实现。...但是每次使用算法1时,总是要停下来仔细思考一下,才敢下手。 最近在Review几年前代码时,发现之前使用算法1写双向链表有bug....这再次使我想对双向链表算法2进行改进,我仔细思考了一下双向链表特性。...双向链表主要有两个功能: 提供反向遍历 以O(1)时间复杂度删除某个节点 但是到目前为止, 我从来没有使用双向链表特性1. 我使用双向链表惟一原因就是要快速删除某一个节点。

    51820

    DS:带头双向循环链表实现

    博主上篇文章介绍了链表,以及单链表实现。 单链表实现(超详细!!) 其实单链表全称叫做不带头单向不循环链表,本文会重点介绍链表分类以及双链表实现!...实际中使⽤链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使⽤代码实现以后会发现结构会带 来很多优势,实现反⽽简单了,后⾯我们代码实现了就知道了。...三、双向链表结点结构体创建 与单链表结点结构体不同是,双向链表结点结构体多了一个前驱结点!!...struct ListNode* prev;//指针保存前一个结点地址 struct ListNode* next;//指针保存后一个结点地址 }LTNode; 四、带头双向循环链表实现 4.1...=NULL必须在主函数中去使用,所以我们在调用销毁链表函数时候,别忘记了phead=NULL!!

    11710

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

    所以对于链表来说,可以将链表头部当作栈顶,用链表做为栈底层实现实现一个栈。 创建一个栈接口,可以使用数组方式或者链表方式进行实现功能哦!...* 39 * @return 40 */ 41 public E peek(); 42 43 } 由于之前已经使用过数组实现栈,所以这里使用链表实现功能...,使用链表实现队列。   ...2)、对于使用数组来实现队列时候,也遇到类似问题,需要改进数组实现队列方式,所以产生了循环队列,对于链表也存在同样问题,我们不能直接使用之前链表结构,需要引入改进该链表,由此引入了尾指针。...94 } 95 96 /** 97 * 使用链表实现队列,出队操作。

    81730

    带头双向循环链表增删查改实现C语言)

    带头双向循环链表 结点结构与头结点创建 头插尾插 打印链表 头删与尾删 链表查找 在pos前面进行插入与删除pos位置结点 销毁链表 完整代码 结点结构与头结点创建 创建两个源文件和一个头文件...test.c linked_list.c linked_list.h 带头双向循环链表,那么,结点结构就要有两个指针域,分别指向前一个结点和后一个结点。...这里尾插就很方便了,不像之前需要遍历找尾,因为是循环链表,尾next就是头结点。 当然这里要先写一个创建新结点函数。...printf("\n"); } 头删与尾删 删除的话,我们需要写一个函数判断链表中是否还有数据,如果只剩一个头结点就不能继续删除了。...void ListErase(LL* pos);//删除pos位置结点 void ListDestory(LL* phead);//销毁链表 linked_list.c #include "linked_list.h

    56700

    rust 入门笔记:使用rust实现双向链表、二叉树

    rust 小练习: 笨办法系列 参考:Learn C The Hard Way 中文版 c32-list: 练习32:双向链表 c33-sort: 练习33:链表算法 c40-bst: 练习40:二叉搜索树...c42-stack-queue: 练习42:栈和队列 c38-hashal:练习38:哈希算法 Leecode题目用Rust实现 参考:https://leetcode-cn.com/problemset.../all/ 文件夹中包含: README.md: 题目的出处和相关描述信息 solution.rs: rust语言实现代码 solution.c: c语言实现代码 题目目录: leetcode-best-time-to-buy-and-sell-stock...朋友圈 双向链表 注意,这里是很早时候写代码,实际上实现双向链表最好要使用 weak 来避免循环引用和内存泄漏问题。...count: i32, first: Option>>, last: Option>> } 函数实现

    58720

    Linux内核中双向链表经典实现

    概要 本文对双向链表进行探讨,介绍内容是Linux内核中双向链表经典实现和用法。其中,也会涉及到Linux内核中非常常用两个经典宏定义offsetof和container_of。...内容包括: 1.Linux中两个经典宏定义 2.Linux中双向链表经典实现 Linux中两个经典宏定义 倘若你查看过Linux Kernel源码,那么你对 offsetof 和 container_of...Linux中双向链表经典实现 1.Linux中双向链表介绍 Linux双向链表定义主要涉及到两个文件: include/linux/types.h include/linux/list.h Linux...中双向链表使用思想 它是将双向链表节点嵌套在其它结构体中;在遍历链表时候,根据双链表节点指针获取"它所在结构体指针",从而再获取数据。...3.Linux中双向链表使用示例 双向链表代码(list.h): 1 #ifndef _LIST_HEAD_H 2 #define _LIST_HEAD_H 3 // 双向链表节点 4 struct

    2.6K30
    领券