栈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篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
随机推荐
- Nginx 搭建图片服务器
Nginx 搭建图片服务器 本章内容通过Nginx 和 FTP 搭建图片服务器.在学习本章内容前,请确保您的Linux 系统已经安装了Nginx和Vsftpd. Nginx 安装:http://www ...
- HBuilder入门(构建h5+APP)
if(window.plus) { plusReady(); } else { //plusready事件(自带事件)调用了才可使用h5+API document.addEventListener(& ...
- kafka原理和实践(一)原理:10分钟入门
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- ThinkPHP中处理验证码不显示问题
在调用验证码之前加上 ob_clean(); 不显示验证码的代码: public function verify(){ $Verify = new \Think\Verif ...
- 用C语言画一个心
用C语言图形库画一个心 --环家伟 这次我教大家用代码画一个心,这样你们就可以送给你们的女(男)朋友了.没找到对象的也可以用来表白啊. 1.首先,我去百度找了心形线的函数,如下: 2. 联系高中的数 ...
- phython廖雪峰
这是小白的Python新手教程,具有如下特点: 中文,免费,零起点,完整示例,基于最新的Python 3版本. Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学 ...
- 为并发而生的 ConcurrentHashMap(Java 8)
HashMap 是我们日常最常见的一种容器,它以键值对的形式完成对数据的存储,但众所周知,它在高并发的情境下是不安全的.尤其是在 jdk 1.8 之前,rehash 的过程中采用头插法转移结点,高并发 ...
- macbookPro 搭建maven环境下载jar包
今天要用itext的jar包,去官网看发现好像只能用maven下载,而我之前又换了电话,没办法咯,重新搭一次maven环境吧,在此记录,已便分享或自己将来查找 首选确定自己环境上jdk装好了,如果没有 ...
- java 接口测试
学习java 时间也不算太长,大学有点基础,学起来也顺手多了,其实我感觉更是因为学习完python之后,在学习别的语言的时候就简单多了,几乎所有的语言学起来都差不多.前几篇写过的都是python接口测 ...
- 如何简单愉快的上手PipelineDB
pipelineDB source:https://github.com/pipelinedb/pipelinedb 安装PipelineDB ./configure CFLAGS="-g ...