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

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

 /*****************************************************
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. [CSP-S模拟测试]:影魔(树状数组+线段树合并)

    题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己 ...

  2. spss-数据清洗-处理重复数据

    spss-数据清洗-处理重复数据 数据导入之后就需要对数据进行清洗.数据清洗主要是对多余重复的数据筛选清除,将缺失的数据补充完整,将错误的数据纠正或者删除.接下来操作如何将重复数据处理操作. 步骤一: ...

  3. SPSS转换菜单:创建时间序列

    SPSS转换菜单:创建时间序列 1.概念:"创建时间序列"对话框允许您基于现有数值型时间序列变量的函数创建新的变量.这些转换后的值在时间序列分析中非常有用. 2.操作:转换-创建时 ...

  4. upc组队赛5 Bulbs

    Bulbs 题目描述 Greg has an m × n grid of Sweet Lightbulbs of Pure Coolness he would like to turn on. Ini ...

  5. upc组队赛2 Hakase and Nano【思维博弈】

    Hakase and Nano 题目描述 Hakase and Nano are playing an ancient pebble game (pebble is a kind of rock). ...

  6. 学习vim 从常用按键开始

      ctrl+e 将屏幕下滚一行 ctrl+u 将屏幕上滚半页 ctrl+d 将屏幕下滚半页 ctrl+b 将屏幕上滚一页 ctrl+f 将屏幕下滚一页 撤销 u 前进 ctrl r 移动 下一个单词 ...

  7. Java面试宝典(5)算法

    二.算法与编程 1.编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔. 答: pack ...

  8. Inversion of Control 控制反转 有什么好处

    作者:Mingqi链接:https://www.zhihu.com/question/23277575/answer/169698662来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  9. miaosha

    1:跨域请求配置 后端Controller 添加注解 @CrossOrigin(origins = {"*"},allowCredentials = "true" ...

  10. PHP中unset和null的比较

    起因 因为感兴趣于unset($var)和$var=null的区别,于是找了一个stackoverflow高分问题及答案,翻译以供参考. 注:以下的问题和答案翻译自http://stackoverfl ...