栈stack(2):栈的链表实现
定义
从上一篇我们知道,栈(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):栈的链表实现的更多相关文章
- BSS段 data段 text段 堆heap 和 栈stack
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- 堆heap和栈Stack(百科)
堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...
- 堆(heap)和栈(stack)的区别
转: 一.预备知识―程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中 ...
- C栈stack
栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作 栈顶(Top):允许操作的一端 栈底(Bottom):不允许操作的一端 Stack的常用操作 创建栈 销毁栈 清空栈 进栈 出栈 获取栈顶元素 ...
- 转:堆(heap)和栈(stack)有什么区别??
简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 预备知识—程序的 ...
- Java栈的实例-数组和链表两种方法(转)
一.栈 栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶 (Top),另一端称为栈底 (Bottom). (2)当表中没有元素时称为空栈. ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
随机推荐
- jvm内存区域与内存溢出
java内存 java动态运行时区域包括:方法区.虚拟机栈.本地方法栈.堆.程序计数器,如右图所示: 程序计数器 程序计数器用来标识要执行的代码的行号,为线程私有 虚拟机栈 为线程所私有 虚拟 ...
- Vuex非常适合新手的教程,保教不会!
本讲解基于Vue-cli(脚手架)搭建的项目. Vuex 数据状态管理工具,整个流程类似依赖注入,相当于预先定义,倒推.(个人理解) 1. 安装vuex 命令行输入 npm install vuex ...
- unity3d资源打包总结
http://www.manew.com/blog-33734-12973.html unity 打包的时候会把下面几个文件资源打进apk或者ipa包里面 1. Asset下的所有脚本文件 2. As ...
- 翻译连载 | 附录 A:Transducing(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件
关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本|Android 8.1 本 ...
- c语言的枚举(遍历枚举)与数据类型总结
一.枚举的概念 枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数.当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型. 比如,你可以用一个枚举类型的变量来表示季节, ...
- Javascript 常用类型检测
1.判断变量是否为数组的数据类型? 方法一 :判断其是否具有"数组性质",如slice()方法.可自己给该变量定义slice方法,故有时会失效. 方法二 :obj instance ...
- 算法训练 区间K大数
算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. ...
- 50个php程序性能优化集锦
1. 用单引号代替双引号来包含字符串,这样做会更快一些.因为 PHP 会在双引号包围的 字符串中搜寻变量,单引号则不会,注意:只有 echo 能这么做,它是一种可以把多个字符 串当作参数的" ...
- Laravel 框架安装
Composer 在命令行执行 create-project 来安装 Laravel:就是下面这一句话就OK了!composer create-project laravel/laravel --pr ...