1.栈是限定仅在表尾进行插入和删除操作的线性表。把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)
2.栈是先进后出(LIFO)结构。
3.栈的插入叫进栈/压栈Push,删除称为出栈Pop。
4.使用链表来完成栈,栈需要一个栈顶指针,正好和单链表头指针功能重合。
5.让头指针指向栈顶,这样push、pop都很方便,使用单链表(不用循环链表)就可以很轻松完成队列,不需要循环,push,pop的时间复杂度都是O(1)。
如果指向栈底,push、pop每次都要遍历到栈顶,时间复杂度O(n),很麻烦。
6.可以让头指针的elem等于栈元素的size。
7.既然用单链表就可以实现栈,为什么还要搞个stack的数据结构出来,而不是直接用单链表呢?(大话数据结构P100)
    栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦于要解决的问题核心。

C语言源代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>  //signal()
#include<string.h>
#include<sys/stat.h>
#include<time.h>
#include<stdarg.h>#if 1
#define INFO_DEBUG    "%d lines in "__FILE__", complie time is "__TIME__" "__DATE__" \n",__LINE__
#define ADI_RUN_ERROR      1
#define ADI_NULL_POINTER  -1
#define ADI_OK             0
#define ADI_PRINT         printf("[%s][%d]:",__FUNCTION__,__LINE__);printf
#define ADI_ASSERT(c,prt,ret)       if(c) {printf(prt);return ret;}
#endiftypedef struct nodeStack{int elem;struct nodeStack *next;
}nodeStack;#define PARAM_FAIL -1
#define P_NULL -2
#define SUCCESS 0/*初始化:只创建头结点(栈顶指针),将栈顶指针的数据域作为栈size计数*/
nodeStack* initStack()
{nodeStack *head = (nodeStack*)malloc(sizeof(nodeStack));if(NULL==head) {printf("NULL");return head;}head->next = NULL;head->elem = 0;return head;
}/*栈stack插入操作可称为push,直接插在末尾,头指针指向栈顶*/
int push(nodeStack *stack,int elem)
{int i=0;if(NULL == stack){ADI_PRINT("err NULL\n");return P_NULL;}nodeStack *node = (nodeStack*)malloc(sizeof(nodeStack));if(NULL==node) {printf("NULL");return P_NULL;}node->next = stack->next;stack->next = node;//将栈顶指针指向新的nodenode->elem = elem;stack->elem++;ADI_PRINT("push elem = %d\n",elem);return SUCCESS;
}int pop(nodeStack *stack)
{if(NULL == stack){ADI_PRINT("err NULL\n");return P_NULL;}if(NULL != stack->next){nodeStack *temp = stack->next;ADI_PRINT("pop ele = %d\n",stack->next->elem);stack->elem--;stack->next = stack->next->next;free(temp);return SUCCESS;}else{ADI_PRINT("stack bottom,pop err !\n");return PARAM_FAIL;}}int longStack(nodeStack *stack)
{return stack->elem;
}int printStack(nodeStack *stack)
{if(NULL == stack){ADI_PRINT("err NULL\n");return P_NULL;}int i = 0;ADI_PRINT("top -> bottom\n");while(NULL != stack->next){ stack = stack->next;ADI_PRINT("list[%d] = %d\n",i,stack->elem);i++;}return SUCCESS;
}int main()
{int ret = 0;nodeStack *stack_test = initStack();if(NULL == stack_test){ADI_PRINT("err \n");return P_NULL;}ret = push(stack_test,0);if(SUCCESS != ret) {ADI_PRINT("push err\n");return PARAM_FAIL;}ret = push(stack_test,3);if(SUCCESS != ret) {ADI_PRINT("push err\n");return PARAM_FAIL;}ret = push(stack_test,5);if(SUCCESS != ret) {ADI_PRINT("push err\n");return PARAM_FAIL;}ret = push(stack_test,7);if(SUCCESS != ret) {ADI_PRINT("push err\n");return PARAM_FAIL;}ret = push(stack_test,9);if(SUCCESS != ret) {ADI_PRINT("push err\n");return PARAM_FAIL;}ADI_PRINT("stack long = %d\n",longStack(stack_test));printStack(stack_test);ret = pop(stack_test);if(SUCCESS != ret) {ADI_PRINT("pop err\n");return PARAM_FAIL;}  ret = pop(stack_test);if(SUCCESS != ret) {ADI_PRINT("pop err\n");return PARAM_FAIL;}  ret = pop(stack_test);if(SUCCESS != ret) {ADI_PRINT("pop err\n");return PARAM_FAIL;} ADI_PRINT("stack long = %d\n",longStack(stack_test));printStack(stack_test);return SUCCESS;
}

C语言单链表实现栈(stack)数据结构相关推荐

  1. C语言单链表实现FCFS算法,数据结构与算法复习题(含答案).doc

    <数据结构与算法>2015-2016学年第1学期考试复习题 选择题(下面各小题有一个正确答案,请将正确答案的编号填写在各小题的括号内). 1.在一棵具有5层的满二叉树中结点总数为( A ) ...

  2. c语言单链表功能,[数据结构]单链表(C语言)的各种功能

    06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...

  3. C语言一趟冒泡交换最小值,C语言单链表冒泡排序为啥以下代码实现不了?

    struct node *sort(struct node *head)/*排序*/ { struct node *p,*q; struct node *temp; for(p=head;p!=NUL ...

  4. C++语言单链表实现荷兰旗问题

    C++语言单链表实现荷兰旗问题 一.设备及软件 VC6.0 二.语言 C++ 三.涉及的数据结构与算法 单链表.尾插法 四.问题描述 荷兰旗问题亦称三色旗问题. 这里荷兰旗用0,1,2分别表示三种颜色 ...

  5. C语言单链表代码实现

    C语言单链表代码实现 一.头文件.常量以及自定义数据结构 #include<stdio.h> #include<malloc.h> #include<stdlib.h&g ...

  6. c语言单链表输出26英文字母,C语言单链表的实现

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表结构: SList.h #pragma once typedef int DataType; typedef st ...

  7. C语言单链表,能直接运行的代码!

    C语言单链表,实现增删改查 不废话 直接上代码,COPY就能运行 #include <stdio.h> #include <stdlib.h> /** *定义数据元素 */ t ...

  8. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  9. c语言单链表倒置(附原理讲解)

    c语言单链表倒置 今天博主,讲一个单链表倒置的例子,事实上 话不多说,我们直接上代码,待会会给大家讲解倒置算法实现原理 #include<stdio.h> #include<stdl ...

最新文章

  1. 机器人把大龙拉出来_LECW4D1综述:塞拉斯一日三登赛场 IgNar机器人重现江湖
  2. Spark DataFrameDataSet
  3. java字符串反转方法【全】
  4. Go的testing包数据类型M/T/B/PB
  5. java media player_MediaPlayerForJava(创建一个视频播放器)
  6. 查找算法(C实现)(待补充)
  7. 给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数
  8. Linux云服务器安装JDK1.8
  9. linux驱动 自旋锁
  10. 与MQ通讯的完整JAVA程序
  11. linux 虚拟一个40段ip,linux – 接口上的Multiples ip地址.我想指定其中一个输出
  12. python学习笔记之property
  13. 1970年代宇航员在月球上生活,如何实现电力供应
  14. 设置cmd命令提示符窗口界面语言为英文
  15. 公众号滑动图代码_微信公众号文章滑动图片怎么做的呢?
  16. SQL字符串首字母大写
  17. Android Service(一) Service初识
  18. 微信公众号微信小程序申请出现的问题
  19. 蓝桥杯:真题 回文数字
  20. CRC32的CrackMe

热门文章

  1. 网站迁移是否会影响 SEO
  2. ROS机器人操作系统最佳实践指南
  3. Github 搜索语法大全
  4. 挑战绕口令《化肥会挥发》从初入江湖到天外飞仙的不同说法
  5. bzoj 1143: [CTSC2008]祭祀river
  6. 新闻网站个人中心(个人信息修改)流程分析
  7. HDU 4915 Parenthese sequence DP
  8. matlab cosd,cos,acos,acosd
  9. Web-Based Enterprise Management (WBEM) Initiative
  10. ChatGPT给国内外科技公司带来了怎样的机遇和威胁?