定义


  从上一篇我们知道,栈(stack)是一个只允许一端进行删除插入操作的线性表。同时,我们联想到线性表的链式结构,其特点是用一组任意的存储单元存储线性表的数据元素,因此我们选择使用链表去实现栈,规定这种实现办法叫做链栈。

主要过程


一.申明结构体类型

 1.node  结点结构体类型    

typedef struct Node
{
SElemType data; //SElemType 指任意数据类型,如int,float
struct Node *next;
}node;

  

 2.stack  栈结构体类型        

typedef struct Stack
{
struct Node *top; //记录栈顶位置
int count; //记录链栈长度
}stack;

二.栈初始化

 1.为结点top申请内存,这里我们假设申请到的内存的地址为为0X01。

 2.count=0

  

三.入栈

 1.定义一个node *型变量p,为其申请内存,这里我们假设申请到的内存的地址为0x02

      

 2.将新结点串入链栈,即是新结点p指向top,p->next=stack->top,注意:指向的方向与链表有所不同,这里是指向旧结构体,即栈底

      

  3.将结点串入下一结点,即是top=p;同时count++

      

  四.出栈

   1.定义一个node *型的变量p,令p=top,结点top串入下一结点

      

   2.把结点p free();释放,即0X02所在的数据域与指针域与被释放。 

       

用处


那么初学者都会想:教练,我学了链栈能干什么?

  可以做以下projects,这些projects都是符合后进先出(LIFO)原则的:

    

代码


  

/*************************************************************************
> File Name:链栈(link_stack)
> Author: Bw98
> Mail: 786016746@qq.com
> Blog: www.cnblogs.com/Bw98blogs/
> Created Time: MON 17th Jul. 2017
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define OK 1
typedef int SElemType; typedef struct Node
{
SElemType data;
struct Node *next;
}node; typedef struct Stack
{
struct Node *top;
int count; //长度
}stack; int init_stack(stack *s); //初始化为空栈
int if_empty_stack(stack *s);
int push(stack *s,int elem); //入栈
int pop(stack *s,SElemType *e); //出栈
int get_top(stack *s); //显示栈顶元素
int show_stack(stack *s);
int clear_stack(stack *s); //链栈置空
int destroy_stack(stack *s); //摧毁栈
int length_stack(stack *s); //链栈长度 int main()
{
stack s;
SElemType elem;
int a;
SElemType *elem2=&a;
init_stack(&s);
is_empty_stack(&s);
printf("入栈开始:\n");
while(scanf("%d",&elem)!=EOF)
{
getchar();
push(&s,elem);
}
show_stack(&s);
printf("该栈的栈顶元素为:\n");
get_top(&s);
pop(&s,elem2);
printf("出栈元素为:%d\n",*elem2);
clear_stack(&s);
is_empty_stack(&s);
return 0;
} int init_stack(stack *s)
{
s->top=(node *)malloc(sizeof(node));
s->count=0;
return OK;
} int is_empty_stack(stack *s)
{
if(s->count==0)
printf("链栈为空!\n");
else
printf("链栈不为空!\n");
return OK;
} int clear_stack(stack *s)
{
node *p=(node *)malloc(sizeof(node));
p=s->top;
while(s->count)
{
p=s->top;
s->top=s->top->next;
free(p);
s->count--;
}
//s->count=0;
printf("清除完毕!\n");
return OK;
}
int length_stack(stack *s)
{
return s->count;
} int push(stack *s,SElemType x)
{
node *p=(node *)malloc(sizeof(node));
p->next=s->top;
s->top=p;
s->count++;
s->top->data=x;
printf("已入栈\n");
return OK;
} int get_top(stack *s)
{
if(s->count!=0)
{
printf("%d\n",s->top->data);
}
else
printf("栈为空,无法返回栈顶元素!\n");
return OK;
} int pop(stack *s,SElemType *e)
{
if(s->count==0)
printf("栈为空,无法实现出栈\n");
else
{
*e=s->top->data;
node *p=(node*)malloc(sizeof(node));
p=s->top;
s->top=s->top->next;
free(p);
printf("出栈完毕!\n");
s->count--;
}
return OK;
} int show_stack(stack *s)
{
printf("栈内元素如下\n"); if(s->count)
{
node *p=s->top;
int i;
for(i=1;i<=s->count;i++)
{
printf("%d ",s->top->data);
s->top=s->top->next;
}
s->top=p;
}
if(s->count==0)
printf("空栈,无法查看栈内元素!\n");
return OK;
}

栈stack(2):栈的链表实现的更多相关文章

  1. BSS段 data段 text段 堆heap 和 栈stack

    BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配.   数 ...

  2. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  3. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  4. 堆heap和栈Stack(百科)

    堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...

  5. 堆(heap)和栈(stack)的区别

    转: 一.预备知识―程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中 ...

  6. C栈stack

    栈是一种  特殊的线性表 栈仅能在线性表的一端进行操作 栈顶(Top):允许操作的一端 栈底(Bottom):不允许操作的一端 Stack的常用操作 创建栈 销毁栈 清空栈 进栈 出栈 获取栈顶元素 ...

  7. 转:堆(heap)和栈(stack)有什么区别??

    简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 预备知识—程序的 ...

  8. Java栈的实例-数组和链表两种方法(转)

    一.栈 栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶 (Top),另一端称为栈底 (Bottom). (2)当表中没有元素时称为空栈. ...

  9. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

随机推荐

  1. 用python画一朵玫瑰花

    废话不多说,直接上代码 from turtle import * import time setup(600,800,0,0) speed(0) penup() seth(90) fd(340) se ...

  2. key-value数据库-Redis

    1.简介 Redis是完全开源的ANSI C语言编写.遵守BSD协议,高性能的key-value数据库. 1.1特点 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载 ...

  3. Lua API 小记1

    这些东西是平时遇到的, 觉得有一定的价值, 所以记录下来, 以后遇到类似的问题可以查阅, 同时分享出来也能方便需要的人, 转载请注明来自RingOfTheC[ring.of.the.c@gmail.c ...

  4. 十三、Hadoop学习笔记————Hive安装先决条件以及部署

    内嵌模式,存储于本地的Derby数据库中,只支持单用户 本地模式,支持多用户多会话,例如存入mysql 下载解压hive后,进到conf路径,将模板拷贝 出现该错误表示权限不够 该目录未找到 新建一个 ...

  5. 【Centos】解决设置JAVA_HOME不断失效问题

    问题还原: 我们都知道,要修改centos的全局配置,可以在/etc/profile这个文件里面修改,比如,我需要修改JAVA_HOME变量 ,那么一般来说我们只要在其中修改,source 一下就行了 ...

  6. css中的float和position

    1.float <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. 在azure中建立DDC集群

    在Azure上建立DDC集群 建立3台虚拟机作为UCP集群,3台虚拟机作为DTR集群. 资源组:HYD-DockerDateCenter 虚拟机size:DS3 4核14G 系统:ubuntu14.0 ...

  8. CCF-201403-1-相反数

    问题描述 试题编号: 201403-1 试题名称: 相反数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反 ...

  9. Mecanim动画系统

    序言:Mecanim动画系统是Unity4.0之后退出的新版动画系统,非常适合人类动画系统.本文是作为自己的学习来讲解的, 可能会有些啰嗦,但尽量把自己的坑都为大家列出来,让大家理解透彻. 一.文件的 ...

  10. Python的列表

    1. Python的列表简介 1. 1 列表的定义 列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表的数据项不需要具有相同的类型.列表中的每个元素都分配一个数字 ,即它的 ...