博文:

【 C 】经典抽象数据类型(ADT)之堆栈(用静态数组实现堆栈)

【 C 】用动态数组实现堆栈

已经讲了两种方式实现堆栈,下面是最后一种方式,也就是链式方式实现堆栈。

由于只有堆栈的顶部元素才可以被访问,所以使用单链表就可以很好地实现链式堆栈。把一个新元素压入堆栈是通过在链表的起始位置添加一个元素实现的。从堆栈中弹出一个元素是通过从链表中移除第1个元素实现的。位于链表头部的元素总是很容易被访问。

下面是用链式结构实现链表的程序:

//一个用链表实现的堆栈,这个堆栈没有长度限制#include < stdio.h >
#include < stdlib.h >
#include < malloc.h >
#include < assert.h >
#include " stack.h "#define FALSE 0//定义一个结构以存储堆栈元素,其中link字段将指向堆栈的下一个元素
typedef struct STACK_NODE
{STACK_TYPE value; //这个类型是在stack.h头文件中定义的struct STACK_NODE *next;
} StackNode;//指向堆栈第一个节点的指针
static StackNode *stack;//create_stackvoid create_stack( size_t size )
{}//destroy_stack
void destroy_stack( void )
{while( !is_empty )pop();
}//push
void push( STACK_TYPE value )
{StackNode *new_node; //因为需要压入一个数值,所以要建立一个新节点new_node = malloc( sizeof( StackNode ) ); //为新节点分配内存assert( new_node != NULL ); //内存分配成功继续,否则退出new_node->value = value;new_node->next = stack;//new_node的指针指向前一个堆栈节点stack = new_node; //stack指针指向新节点,stack始终指向栈顶节点
}
//pop
void pop( void )
{StackNode *first_node; //这个指向节点的指针意义在于一个中间指针变量,指向栈顶节点,然后释放assert( !is_empty() );first_node = stack;stack = first_node->next;free( first_node );
}//top
STACK_TYPE top( void )
{assert( !is_empty() );return stack->value;
}//is_empty
int is_empty( void )
{return stack == NULL;
}//is_full
int is_full( void )
{return FALSE; //永远不会满
}

STACK_NODE结构用于把一个值和一个指针捆绑在一起,而stack变量是一个指向这些结构变量之一的指针。当stack指针为NULL时,堆栈为空,也就是初始时的状态。

提示:destroy_stack 函数连续从堆栈中弹出元素,直到堆栈为空。同样,注意这个函数使用了现存的is_empty和pop函数,而不是重复那些用于实际操作的代码。

create_stack函数是一个空函数。由于链式堆栈不会填满,所以is_full函数返回假。


最后我提出一个问题,放这里等待我解决,定义

//指向堆栈第一个节点的指针
static StackNode *stack;

这个指针的时候,不应该给它赋值为NULL吗?

然后配合push函数:

//push
void push( STACK_TYPE value )
{
    StackNode *new_node; //因为需要压入一个数值,所以要建立一个新节点
    
    new_node = malloc( sizeof( StackNode ) ); //为新节点分配内存
    assert( new_node != NULL ); //内存分配成功继续,否则退出
    new_node->value = value;
    new_node->next = stack;//new_node的指针指向前一个堆栈节点
    stack = new_node; //stack指针指向新节点,stack始终指向栈顶节点
}

创建第一个堆栈节点并指向该节点,第一个节点的指针字段值为NULL。

或者是我想错了,第一次学。留在这里!等待查阅!

【 C 】用链表实现堆栈相关推荐

  1. java 链表实现堆栈_《Java数据结构与算法》笔记-CH5-链表-4用链表实现堆栈

    //用链表实现堆栈 /** * 节点类 */ class LinkS { private long data; public LinkS next; public LinkS(long d) { th ...

  2. VC里的集合类、链表类、映射类

    集合类是用来容纳和处理一组对象或标准数据类型变量的C++类.每个集合类对象可以看作一个单独的对象.类成员函数可作用于集合的所有元素.MFC提供两种类型的集合类: 基于模板的集合类.非基于模板的集合类. ...

  3. 数据结构之线性结构之堆栈

    二,堆栈 中缀表达式:运算符位于两数之后: a+b*c-d/e 后缀表达式:运算符位于两数之后: abc*+de/-:计算机表示式求解时的读法:用堆栈实现计算 前缀表达式:运算符位于两数之前: -+a ...

  4. 数据结构之堆栈与队列

    堆栈与队列是两种重要的基础数据结构,一个是先入后出,一个是先入先出,有着广泛的应用,本文分别使用数组与链表实现堆栈与队列 顺序存储方式实现堆栈 #define MaxSize 20 #define E ...

  5. 堆栈区别java总结_堆栈的区别

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 浅谈堆栈的区别 ? ? ? ? ? ?堆栈在计算机中是两种不同的数据结构:堆是队 ...

  6. 堆栈在计算机中的应用,堆栈

    [duī zhàn] 堆栈 语音 编辑 锁定 讨论 上传视频 在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项 ...

  7. 几何匹配和分合算法的图像识别技术

    第一章  引言 1.1  面像定位概述及其与面像识别的关系     这个设计所涉及到的是面像的定位和识别.简单来说,所谓面像的定位,就是在照片(静态图像)或视频(动态图像)中标出面像所在的位置,把面像 ...

  8. 想去Google做AI?先看完这套面试指南(附面试题)

     作者 | 阿司匹林 出品 | 人工智能头条(公众号ID:AI_Thinker) 凭借强大的技术实力和良好的工作氛围,Google 对求职者一直有着强大吸引力. 虽然 Google 在几年前就已经 ...

  9. 想去Google做AI?面试题在手,全程无忧!

    作者 | 阿司匹林 出品 | 人工智能头条(公众号ID:AI_Thinker) 凭借强大的技术实力和良好的工作氛围,Google 对求职者一直有着强大吸引力. 虽然 Google 在几年前就已经退出了 ...

最新文章

  1. 微信小游戏创业,究竟是红海还是死海?
  2. 谷歌将采取自动化系统审核,预计被误删视频数量或将大增
  3. coo_maxtrix保存到本地
  4. MVC Html.AntiForgeryToken() 防止CSRF***
  5. php定时任务(自己)
  6. XCode - 无法对iPhone真机调试的解决方法!
  7. idea 自动生成mybaits_如何让idea自动创建mybatis配置文件?
  8. pcl_viewer 常用实用指令
  9. 数据结构期末复习第一章绪论
  10. idea weblogic 部署慢_IDEA+weblogic部署运行项目
  11. 解析word文件的简单实现
  12. Mellanox IB卡介绍
  13. 快乐、聪明和有用,你会如何选择?
  14. 微信公众平台开发(49)物联网硬件设备控制技术
  15. 找单生狗,模拟atoi,模拟offsetof,交换奇偶位
  16. 旅行好帮手:精准可靠的航班动态数据服务
  17. 单元测试探析:什么是Stubs、Mocks、Spies、Dummies?带你了解4个核心工具
  18. Excel每次打开文件都会出现一个空白sheet1文件的一个解决方法
  19. 曾李青:早期创业公司九种死法
  20. 未来5年,IT领域7个吃香的领域

热门文章

  1. windows下硬盘安装mint10
  2. 中华图标网--http://sinoLogo.cn
  3. dataframe iloc_DataFrame
  4. 简述bios在计算机系统中的作用,BIOS的主要作用
  5. _网站建站基础第十一课(域名解析服务器环境linux安装宝塔)
  6. JS判断元素是否在数组内
  7. 浅谈JavaScript中按键事件的e.keyCode || e.which || e.charCode
  8. mysql口令更换周期_Linux设置口令复杂度和口令定期更换策略
  9. linq where 数组_C#中LINQ与数据管道
  10. 2021年春季学期-信号与系统-第十五次作业参考答案