使用带头结点的单链表实现

主要使用链表中的头插来实现栈的先进后出的特点

 /*****************************************************
Author:Simon_Kly Version:0.1 Date: 20170520
Description: 动态栈
Mail: degaullekong@gmail.com
Funcion List:
*****************************************************/ #include <stdio.h>
#include <stdlib.h> enum return_result {EMPTY_OK = , EMPTY_NO, PUSH_OK, PUSH_NO, POP_OK, POP_NO}; typedef struct node
{
int data;
struct node * next;
}Node, *Link;//链结构 typedef struct stk
{
Link space;
}Stack;//栈结构 /*malloc是否正确执行*/
void is_malloc_ok(void * node)
{
if (node == NULL)
{
printf("malloc error!\n");
exit(-);
}
} /*创建一个栈*/
void create_stack(Stack ** stack)
{
*stack = (Stack *)malloc(sizeof(Stack));
is_malloc_ok(*stack);
(*stack)->space = (Link)malloc(sizeof(Node));
is_malloc_ok((*stack)->space);
} /*初始化栈*/
void init_stack(Stack *stack)
{
stack->space->next = NULL;
} /*创建一个压栈元素*/
void create_node(Link * new_node)
{
*new_node = (Link)malloc(sizeof(Node));
is_malloc_ok(*new_node);
} /*压栈*/
void push_stack(Stack *stack, Link new_node)
{
new_node->next = stack->space->next;
stack->space->next = new_node;
} /*判断栈空*/
int is_stack_empty(Stack *stack)
{
Link p = NULL; p = stack->space->next; if (p == NULL)
{
return EMPTY_OK;
} return EMPTY_NO;
} /*出栈*/
int pop_stack(Stack *stack)
{
Link p = NULL;
int data; if (stack == NULL)
{//栈不存在
printf("stack is not exist!\n");
exit(-);
} if (EMPTY_OK == is_stack_empty(stack))
{
printf("stack is empty!\n");
return POP_NO;
}
p = stack->space->next;
stack->space->next = p->next; data = p->data; free(p);//释放栈顶 return data;
} /**/
void release_stack(Stack **stack)
{
Link p = NULL; if (EMPTY_NO == is_stack_empty(*stack))
{//栈不空
p = (*stack)->space->next; while ((*stack)->space->next != NULL)
{
(*stack)->space->next = p->next;
free(p);
p = (*stack)->space->next;
}
}
free((*stack)->space);//链头结点
free(*stack);//释放栈
*stack = NULL;
} int main()
{
int i;
int ret;
Stack *stack = NULL;
Link new_node = NULL;//入栈新元素 create_stack(&stack); init_stack(stack); for (i = ; i < ; i++)
{//入栈
create_node(&new_node);
new_node->data = i + ;
push_stack(stack, new_node);//相当于链表的头插
} for (i = ; i < ; i++)
{//出栈
ret = pop_stack(stack); if (ret == POP_NO)
{
break;
}
printf("%d\n", ret);
} release_stack(&stack);
pop_stack(stack);
return ;
}

动态栈-------C语言的更多相关文章

  1. 动态修改 C 语言函数的实现

    Objective-C 作为基于 Runtime 的语言,它有非常强大的动态特性,可以在运行期间自省.进行方法调剂.为类增加属性.修改消息转发链路,在代码运行期间通过 Runtime 几乎可以修改 O ...

  2. 数据结构与算法之顺序栈C语言实现

    顺序栈是一种特殊的顺序表,主要操作是入栈和出栈.将顺序表加一些特定限制,就成了顺序栈. 注: 1.顺序栈C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简 ...

  3. 我们说的oc是动态运行时语言是什么意思?

    1.KVC和KVO区别,分别在什么情况下使用?  答:KVC(Key-Value-Coding) KVO(Key-Value-Observing)理解KVC与KVO(键-值-编码与键-值-监看) 当通 ...

  4. 用OC实现一个栈:结合单链表创建动态栈

    一.介绍 栈是一种数据存储结构,存储的数据具有先进后出的特点.栈一般分为动态栈和静态栈. 静态栈比较好理解,例如用数组实现的栈.动态栈可以用链表来实现. 方式:固定base指针,每次更改top指向入栈 ...

  5. Java动态调用脚本语言Groovy

    Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...

  6. 可存放任意类型变量的动态数组--C语言实现

    之前在训练营的时候被要求用C语言实现一个可以存放任意类型数据的栈.现在尝试实现一个数组版本. 首先用到的结构体如下(接触了Win32编程所以长得有点像里面的那些类型): typedef struct ...

  7. 享受Python和PHP动态类型检查语言的快感

    前言 写这文章的时候特地查了资料,以确保我没有说错关于Python和PHP的类型机制. 所以这里放一张图,关于强弱类型与动态/静态类型检查的区分 从分类上看,PHP属于弱类型语言,而Python属于强 ...

  8. WPF实现无刷新动态切换多语言(国际化)

    1. 在WPF中国际化使用的是 .xaml文件的格式 如图:Resource Dictionary (WPF) 2. 创建默认的语言文件和其他语言文件 这里以英语为默认语言,新建一个 Resource ...

  9. easyui 动态加载语言包

    解决办法是:把语言包中的语言类型写到cookie,动态修改cookie中的语言名称,修改完后重新渲染一下页面. 在页面加载完成后,先判断cookie存不存在,如果不存在就写入默认语言,存在就给easy ...

随机推荐

  1. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)

    传送门 解题思路 设\(f(x)\)表示到\(x\)这个点的期望次数,那么转移方程为\(f(x)=\sum\frac{f(u)*(1 - \frac{p}{q})}{deg(u)}\),其中\(u\) ...

  2. BZOJ 2839: 集合计数(二项式反演)

    传送门 解题思路 设\(f(k)\)为交集元素个数为\(k\)的方案数.发现我们并不能直接求出\(f(k)\),就考虑容斥之类的东西,容斥首先要扩大限制,再设\(g(k)\)表示至少有\(k\)个交集 ...

  3. 重新学习MySQL数据库11:以Java的视角来聊聊SQL注入

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  4. java 京东登录

    package org.rx.service.media; import io.netty.channel.Channel; import io.netty.handler.codec.http.Ht ...

  5. ZJUT11 多校赛补题记录

    牛客第一场 (通过)Integration (https://ac.nowcoder.com/acm/contest/881/B) (未补)Euclidean Distance (https://ac ...

  6. idea下远程debug配置

    一. 背景: 在测试工作中,为方便发现代码中的逻辑问题,尝试使用远程debug模式,在测试过程中走查代码,不仅可以辅助测试减少与开发的沟通成本,更便于了解业务提升测试深度. 二. 配置方式: 1. 调 ...

  7. c# 关于DataTable

    1.DataRow数组 转DataTable using (SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=123;da ...

  8. docker安装及使用

    一.简介 说起docker,大多数人第一时间想起来的应该有虚拟化.云计算,这三者有什么区别呢? 对比: 我们所熟知的虚拟化有KVM.xen.Hyper-V等,这些虚拟化虚拟出来的服务器会产生一个新的操 ...

  9. oracle锁表和解锁

    1.查看锁表清空 select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID; alter system k ...

  10. spring_AOP的注解开发

    logger日志类: package cn.mepu.utils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.la ...