栈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篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
随机推荐
- Java父线程(或是主线程)等待所有子线程退出
static void testLock1(){ final AtomicInteger waitCount = new AtomicInteger(30000); final Object wait ...
- System.UnauthorizedAccessException 错误
给目录添加 "Authenticated Users" 这个用户的 读写权限
- laravel中with()方法,has()方法和whereHas()方法的区别
with() with()方法是用作"渴求式加载"的,那主要意味着,laravel将会伴随着主要模型预加载出确切的的关联关系.这就对那些如果你想加在一个模型的所有关联关系非常有帮助 ...
- JavaEE中的MVC(三)定制Struts——命令模式
注:本文并不讲解Struts框架,只研究这种思想的使用 JavaEE中的MVC(五)定制Struts--Action跳转Jsp 在讲这个之前,先给你们看一下我服务器1.0版本的截图,是不是很可笑,看起 ...
- 自动化运维工具——ansible详解(一)
ansible 简介 ansible 是什么? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统 ...
- 已有模板与tp框架结合
具体实现步骤: ①复制模板文件到view指定文件目录: ②复制css.js.img到view指定文件目录: ③把静态资源(css.js.img)文件的路径设置为“常量”信息(在index.php入口文 ...
- P1156 垃圾陷阱
题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...
- video视频铺满
1. 因项目需求,要在公司官网加一段视频,达到的效果是视频平铺整个网页,大小随网页变化:网上找了许久才找了了这么一个生僻的属性,只需给video加这么个样式就可以了:object-fit: fill; ...
- 基于Node的高性能MVC框架
赶上公司去Windows化,有一大波.net站点需要转成Node.js,于是自己就顺便琢磨一个通用的Node版MVC框架. 经过几天的努力,beta版终于面世了!因为其高性能的特点,特地命名node- ...
- c# textbox的滚动条总是指向最底端
当我第一次添加滚动条时候,我发现滚动条总是跑向上方,经过研究 解决方案如下: this.textBox1.Focus(); 获取焦点 this.textBox1.Select(this.textBox ...