前段时间写了双向链表,现在写个栈,写之前,先简单介绍链表 队列  栈的区别:

链表,队列,堆栈的区别
1、栈是个有底的口袋,像袜子。
队列是没底的口袋,像通心粉。
所以:栈的特点是先进后出,队列的特点是先进先出。
2、主要区别是适用的地方不一样,   
  链表实际上可以认为是一种数据的物理组织形式,是用指针或对象的引用组织起的一种数据的存储方式.   
  队列和堆栈是一个更高层次的概念,其底层可以是用链表也可以是用数组来实现.   
  队列和堆栈的主要区别是进出的顺序不一样,   
  队列是先进先出,堆栈是后进先出.   
3、cooled(经典中--经过非典中)   说的很详细了,我补充一下   
  队列和堆栈是一种特殊的数据组织形式。   
  可以把他们看成是一系列的集合。   
  队列可以看成是有2个口的集合一个口叫队头一个叫队尾,只能在对头进行删除操作,在队尾做插入。根据这样的操作。队列特点是先进先出   
  堆栈可以看成是有1个口的集合,这个口叫栈顶。插入和删除操作只能在栈顶操作。根据这样的操作。堆栈的特点是是后进先出.   
  链表是一种存储方式,它可以在非连续的内存空间里面存储一个集合的元素。和它对应的是数组,数组要在连续的空间里存储集合的元素

下面是栈的实验代码:

Stack.h

[cpp] view plaincopy
  1. #ifndef _Stack_H
  2. #define _Stack_H
  3. typedef struct node
  4. {
  5. int data;
  6. struct node *down;
  7. }PNode;
  8. typedef struct stack
  9. {
  10. PNode *top;
  11. int size;
  12. }Stack;
  13. Stack *InitStack();
  14. void DestroyStack(Stack *ps);
  15. void ClearStack(Stack *ps);
  16. int IsEmpty(Stack *ps);
  17. int GetSize(Stack *ps);
  18. PNode *GetTop(Stack *ps,int *pitem);
  19. PNode *Push(Stack *ps,int item);
  20. PNode *Pop(Stack *ps,int *pitem);
  21. void StackTraverse(Stack *ps,void (*visit)());
  22. #endif

Stack.c

[cpp] view plaincopy
  1. #include <stdio.h>
  2. #include "Stack.h"
  3. #include <malloc.h>
  4. #include <stdlib.h>
  5. Stack *InitStack()
  6. {
  7. Stack *ps;
  8. ps=(Stack *)malloc(sizeof(Stack));
  9. if(ps!=NULL)
  10. {
  11. ps->top = NULL;
  12. ps->size = 0;
  13. }
  14. return ps;
  15. }
  16. void DestroyStack(Stack *ps)
  17. {
  18. if(IsEmpty(ps)!=1)
  19. ClearStack(ps);
  20. free(ps);
  21. }
  22. void ClearStack(Stack *ps)
  23. {
  24. while(IsEmpty(ps)!=1)
  25. {
  26. Pop(ps,NULL);
  27. }
  28. }
  29. int IsEmpty(Stack *ps)
  30. {
  31. if(ps->top == NULL&&ps->size == 0)
  32. return 1;
  33. }
  34. int GetSize(Stack *ps)
  35. {
  36. return ps->size;
  37. }
  38. PNode *GetTop(Stack *ps,int *pitem)
  39. {
  40. if(IsEmpty(ps)!=1&&pitem!=NULL)
  41. {
  42. *pitem = ps->top->data;
  43. }
  44. return ps->top;
  45. }
  46. PNode *Push(Stack *ps,int item)
  47. {
  48. PNode *pnode = (PNode *)malloc(sizeof(PNode));
  49. if(pnode!=NULL)
  50. {
  51. pnode->data = item;
  52. pnode->down = GetTop(ps,NULL);
  53. ps->size++;
  54. ps->top = pnode;
  55. }
  56. return pnode;
  57. }
  58. PNode *Pop(Stack *ps,int *pitem)
  59. {
  60. PNode *pnode = ps->top;
  61. if(IsEmpty(ps)!=1&&pnode!=NULL)
  62. {
  63. if(pitem!=NULL)
  64. *pitem = pnode->data;
  65. ps->size--;
  66. ps->top = ps->top->down;
  67. free(pnode);
  68. }
  69. return ps->top;
  70. }
  71. void StackTraverse(Stack *ps,void(*visit)())
  72. {
  73. PNode *p = ps->top;
  74. int i = ps->size;
  75. while(i--)
  76. {
  77. visit(p->data);
  78. p = p->down;
  79. }
  80. }

Test.c

[cpp] view plaincopy
  1. #include "Stack.h"
  2. #include <stdio.h>
  3. void print(int i)
  4. {
  5. printf("The data of this node is:%d\n",i);
  6. }
  7. int main()
  8. {
  9. Stack *ps = InitStack();
  10. int i,item;
  11. printf("0-9 push in stack,and print:\n");
  12. for(i=0;i<10;i++)
  13. {
  14. Push(ps,i);
  15. GetTop(ps,&item);
  16. printf("%d",item);
  17. }
  18. printf("\nTraverse from stacktop to stack down and print\n");
  19. StackTraverse(ps,print);
  20. printf("The data of stack pop as it's turn and print:\n");
  21. for(i=0;i<10;i++)
  22. {
  23. Pop(ps,&item);
  24. printf("%d",item);
  25. }
  26. ClearStack(ps);
  27. if(IsEmpty(ps))
  28. printf("\nIt is a success to clear the stack\n");
  29. DestroyStack(ps);
  30. printf("The stack is destroyed!\n");
  31. }

执行结果如下:

makefile:

Linux c 算法与数据结构--栈相关推荐

  1. 算法与数据结构 -- 栈与队列(四)

    栈与队列定义了数据的操作 一.栈 栈是一种先入先出的数据结构.可以用顺序表实现,也可以用链表实现 栈操作 判断是否为空 压栈.入栈push 出栈 pop 返回栈顶元素 peek 栈的元素个数 # co ...

  2. Linux c 算法与数据结构--双向链表

    链表是linux c中非常重要的数据结构,双向链表与单向链表的区别,是它每个节点有两个指针域,分别指向该节点的前一个节点与后一个节点: 而链表的操作主要是查询.插入.删除.遍历等,下面来看一个双向链表 ...

  3. Linux C 算法与数据结构 --二叉树

    头文件BiTree.h [cpp] view plaincopy typedef int Item; typedef struct node { struct node * lchild; struc ...

  4. 【算法入门必刷】数据结构-栈(一)

    [牛客网面试入门必刷]算法入门-数据结构-栈(一) 前言 算法入门刷题训练 题一:AB1 [模板]栈 题目分析 理论准备 题解 小结

  5. 猿创征文|【算法入门必刷】数据结构-栈(二)

    [算法入门必刷]算法入门-数据结构-栈(二) 前言 算法入门刷题训练 题目AB2: 栈的压入.弹出序列 题目分析 理论准备 题解 小结

  6. 猿创征文 |【算法入门必刷】数据结构-栈(三)

    [算法入门必刷]算法入门-数据结构-栈(三) 前言 算法入门刷题训练 题目AB3:有效括号序列 题目分析 理论准备 题解 小结

  7. 猿创征文 |【算法入门必刷】数据结构-栈(四)

    [算法入门必刷]算法入门-数据结构-栈(四) 前言 算法入门刷题训练 AB4:逆波兰表达式求值 题目分析 理论准备 题解 小结

  8. Caché 算法与数据结构

    第一章 Caché 算法与数据结构 基础和概念 ☆☆☆☆☆ 第二章 Caché 算法与数据结构 数组原理 ☆☆☆☆☆ 第三章 Caché 算法与数据结构 链表原理 ☆☆☆☆☆ 第四章 Caché 算法 ...

  9. linux 复制栈数据结构,算法-数据结构-堆栈

    算法-数据结构-堆栈 发布时间:2005-09-09 17:46:22来源:红联作者:frog /*************************************************** ...

  10. 队列的基本操作_算法与数据结构(五) 栈和队列

    ? 工欲善其事,必先利其器. 栈和队列 - Stack And Queue 栈 如何理解栈呢? 后进者先出,先进者后出,这就是典型的 "栈" 结构. 04_栈和队列-栈结构 从栈的 ...

最新文章

  1. 明年,我要用 AI 给全村写对联
  2. Linux Centos7安装chrome浏览器
  3. mysql编辑工具wf_轻松构建自定义WF设计器
  4. VC++中把一个对话框最小化到托盘
  5. RSA加密解密及数字签名Java实现--转
  6. 2020癌症大数据分析,哪些癌症最要命?
  7. C语言切割多层字符串(strtok_r strtok使用方法)
  8. sql如何先排序再去重
  9. java sox语音_Sox语音转换的相关知识
  10. 十七、PHP框架Laravel学习笔记——模型的定义
  11. 人工智能能够构建一个自主驱动云吗?
  12. 帆软动态分页之单数据集行式报表(模板-引擎设设置启用及行数)
  13. itextPdf pdf加水印
  14. 浅谈Android中的MVP架构
  15. OVF 和 OVA 文件格式和模板的区别
  16. stylus -w style.styl -o style.css
  17. 【ubuntu】The following signatures couldn‘t be verified because the public key is not available
  18. vue3 provide 与 inject 用法
  19. GSoC 从开始到中选
  20. 【评测】一种组织蛋白快速提取方法

热门文章

  1. magento去除子分类的url地址中带有父分类的url key
  2. 女人必知:10个好习惯 让老公不想出轨
  3. 是什么使波西米亚狂想曲成为杰作-数据科学视角
  4. 贝叶斯统计 传统统计_统计贝叶斯如何补充常客
  5. leetcode 1631. 最小体力消耗路径(并查集)
  6. Bootstrap 4:如何使顶部固定的Navbar保持在容器中而不拉伸?
  7. react 中渲染html_如何在React中识别和解决浪费的渲染
  8. rails 共享变量_如何将Rails实例变量传递给Vue组件
  9. 真实感人故事_您的数据可以告诉您真实故事吗?
  10. 微服务框架---搭建 go-micro环境