,即用链表实现栈存储结构。


链栈的实现思路同顺序栈类似,顺序栈是将数顺序表数组)的一端作为栈底,另一端为栈顶;链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底。

将链表头部作为栈顶的一端,可以避免在实现数据 "入栈" 和 "出栈" 操作时做大量遍历链表的耗时操作。

链表的头部作为栈顶,意味着:

  • 在实现数据"入栈"操作时,需要将数据从链表的头部插入;
  • 在实现数据"出栈"操作时,需要删除链表头部的首元节点

因此,链栈实际上就是一个只能采用头插法插入或删除数据的链表。

代码如下:

#include "stdio.h"
#include "stdlib.h"typedef struct linestack{      //定义链式栈结构 int data;                 struct linestack *next;
}linestack;                     //用typedef将 struct linestack取代为linestack
linestack *push(linestack *stack,int a)     //入栈操作
{linestack *line=(linestack*)malloc(sizeof(linestack));    //新建栈分配动态内存 line->data=a;                   //将数据域带入 line->next=stack;              //将新的栈顶节点指向老节点 stack=line;                     //新栈顶为line return stack;                    //返回栈顶
}
linestack *pop(linestack *stack)    //出栈操作
{if(stack)                      //如果栈顶不为空 {linestack *p=stack;         //定义个指针节点代表栈顶 printf("弹栈元素为%d\t",p->data); //输出栈顶元素 stack=p->next;             //将下个节点作为新栈顶 free(p);                   //释放掉p节点 老栈顶 if(stack)                  //如果新栈顶存在 {printf("新栈顶为%d\n",stack->data);         //输出新栈顶的元素 }else{   printf("栈已空\n");  //否则输出栈空 } }else{printf("栈内没有元素\n");  //当一开始栈就没有元素时输出空栈 return stack;}return stack;
}
int main()
{linestack *stack=NULL;            //定义栈顶为空 stack=push(stack,1);          //入栈操作 stack=push(stack,2);stack=push(stack,3);stack=push(stack,4);stack=pop(stack);                //出栈操作 stack=pop(stack);stack=pop(stack);stack=pop(stack);stack=pop(stack);return 0;
}

运行结果:

链栈的基本操作(入栈,出栈)相关推荐

  1. 大话数据结构第四章栈的基本概念与出栈入栈操作

    一.栈的顺序存储结构 1.基本概念 栈顶就是表尾. 栈顶是栈插入和删除的地方. 栈就是只允许在表尾进行添加或删除,是顺序存储结构线性表的特例或者说简化. 为什么说是简化呢?相对于顺序存储结构来说栈只允 ...

  2. 【剑指offer-Java版】22栈的压入弹出序列

    栈的压入弹出序列:给定两个序列,一个是压入顺序,判断另外一个是否是该压入顺序的一个弹出顺序 思路:纯粹的模拟栈的压入和弹出顺序 分别遍历压栈序列seq1和另一个序列seq2 比较当前栈顶元素和seq2 ...

  3. 剑指offer-21.栈的压入弹出序列

    1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  4. 在堆栈中,push为入栈操作,pop为出栈操作

    LinkedList提供以下方法:(ArrayList无此类方法) addFirst(); removeFirst(); addLast(); removeLast(); 在堆栈中,push为入栈操作 ...

  5. 算法笔记--简单实现栈的先入后出(FILO,First In Last Out)功能

    算法笔记–简单实现栈的先入后出(FILO,First In Last Out)功能 stack 栈,是一个 先入后出(FILO,First In Last Out)的 有序列表,可以形象地理解为手枪的 ...

  6. 1.栈的压栈(入栈、进栈)及出栈 2.顺序表及链表的缓存命中

    一.栈的压栈(入栈.进栈)及出栈 1.栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作.进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底.栈中的数据元素 ...

  7. Java之根据入栈顺序是否能得到出栈顺序

    入栈.出栈顺序匹配 前言 一.Java入栈.出栈 1.例题 二.题解 A.纯正的模拟 B.LinkedHashSet C.利用CPU 总结 参考文献 前言 给出入栈顺序,匹配一个出栈顺序是否合法,即出 ...

  8. 已知入栈顺序求所有的出栈顺序已知出栈顺序求所有的入栈顺序

    一.已知入栈顺序求所有的出栈顺序 已知入栈顺序是{1,2,3,4,5},求所有的出栈顺序? 我的思路: 既然入栈顺序固定,我觉得可以使用递归来做. 先定义一个函数,比如说叫做help. //伪代码 v ...

  9. 栈 - 关于出栈序列,判断合法的出栈序列

    文章目录 1 引例 2 做题方法 3 原因 3.1 选项D(4 3 1 2)的模拟 1 引例 (例)设栈的入栈序列是 1 2 3 4,则下列不可能是其出栈序列的是( ). A. 1 2 4 3 B. ...

  10. 数据结构实验之栈与队列七:出栈序列判定

    Description 给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次.输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序 ...

最新文章

  1. TensorFlow练习12: 判断男声女声
  2. Apache James使用的方法及相关心得(转)
  3. 《系统集成项目管理工程师》必背100个知识点-63供应商选择
  4. Linux中自动删除n天前日志
  5. java 静态类 静态方法_JAVA的静态变量、静态方法、静态类
  6. Android开发中EditText获得焦点弹出输入框改变屏幕布局的问题
  7. Mysql错误1366的解决办法:Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1
  8. RHEL 7.2 + Oracle 12cR2 + RAC
  9. vb用鼠标实现屏幕绘图
  10. Atitit it业界与软件界的定律 原则 准则 法则 效应
  11. Java递归算法实例
  12. python写入文件后换行_python写入文件自动换行问题的方法
  13. Apktool反编译
  14. 凸优化理论基础2——凸集和锥
  15. 大数据会议资料学习笔记201402
  16. springboot 配置日志文件
  17. 网站开发进阶(十一)如何将一个jsp页面嵌套在另一个页面中
  18. 网站优化与seo的方法(seo的优化基础)
  19. keil5 c语言运行
  20. 项立刚:FDD牌照发放 难改行业大格局

热门文章

  1. 2022-05-24 游程编码与位图压缩(C++)
  2. 双目相机计算稠密深度点云详解教程
  3. intelliJ IDEA 2017 破解方法
  4. 万字长文:被阿里收购有多好?凉了有多少?
  5. Word、Excel组合批量打印信封(转)
  6. java冒泡排序(含冒泡排序代码)
  7. TXS0108双向电平转换芯片用于IIC时的问题
  8. 工业相机基本参数及选型
  9. E: Unable to locate package mingw32
  10. 基于matlab的语音信号处理