栈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篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
随机推荐
- 5)C语言函数(C自考学习)
函数的概念 在一个程序中,如果在不同地点多次执行某项操作,就可以把完成这项操作的程序段从程序中独立出来,定义成函数,而原来程序中凡需要进行这个操作的程序段可以只用"函数调用"来替代 ...
- 1455:An Easy Problem
传送门:http://noi.openjudge.cn/ch0406/1455/ /-24作业 //#include "stdafx.h" #include<bits/std ...
- 十、VueJs 填坑日记之在项目中使用Amaze UI
上一篇博文,我们把jQuery集成到了项目中,今天我们来集成Amaze ui(妹子UI).先来介绍一下妹子UI.Amaze UI 含近 20 个 CSS 组件.20 余 JS 组件,更有多个包含不同主 ...
- 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)
微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...
- THinkPHP的认识
四中路由方式:http://网址/index.php?m=分组&c=控制器&a=操作方法(但是这个不安全,不推荐使用)http://网址/index.php/分组/控制器/操作方法(默 ...
- ES 入门之一 安装ElasticSearcha
安装ElasticSearcha 学习ES也有快一个月了,但是学习的时候一直没有总结.以前没有总结是因为感觉不会的很多,现在对ES有一点了解了.索性就从头从安装到使用ES做一个详细的总结,也分享给其他 ...
- cinder块存储 后端采用lvm、nfs安装配置
#cinder块存储 后端采用lvm.nfs安装配置 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html #cinder ...
- POJ1006-Biorhythms
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 129706 Accepted: 41287 Des ...
- Nginx负载均衡的优缺点
Nginx的优点是: 1.工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名.目录结构,它的正则规则比HAProxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx ...
- <算法>进制转换超详细
16转10 用竖式计算: 16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方 第0位: 5 * 16^0 = 5 第1位: F * 16^1 = 240 第 ...