在C++中,可以直接使用std::stack

C语言实现如下:

 stack.c

 /**
* @file stack.c
* @brief 栈,顺序存储.
*
*
*
*/ #include <stdlib.h> /* for malloc() */
#include <string.h> /* for memcpy() */ typedef int stack_elem_t; // 元素的类型 /**
* @struct
* @brief 栈的结构体
*/
typedef struct stack_t {
int size;         /** 实际元素个数 */
int capacity;       /** 容量,以元素为单位 */
stack_elem_t *elems;   /** 栈的数组 */
}stack_t; /**
* @brief 初始化栈.
* @param[inout] s 栈对象的指针
* @param[in] capacity 初始容量
* @return 无
*/
void stack_init(stack_t *s, const int capacity) {
s->size = ;
s->capacity = capacity;
s->elems = (stack_elem_t*)malloc(capacity * sizeof(stack_elem_t));
} /**
* @brief 释放栈.
* @param[inout] s 栈对象的指针
* @return 无
*/
void stack_uninit(stack_t *s) {
s->size = ;
s->capacity = ;
free(s->elems);
s->elems = NULL;
} /**
* @brief 判断栈是否为空.
* @param[in] s 栈对象的指针
* @return 是空,返回 1,否则返回 0
*/
int stack_empty(const stack_t *s) {
return s->size == ;
} /**
* @brief 获取元素个数.
* @param[in] s 栈对象的指针
* @return 元素个数
*/
int stack_size(const stack_t *s) {
return s->size;
} /**
* @brief 进栈.
* @param[in] s 栈对象的指针
* @param[in] x 要进栈的元素
* @return 无
*/
void stack_push(stack_t *s, const stack_elem_t x)
{
if(s->size == s->capacity)
{
/* 已满,重新分配内存 */
stack_elem_t* tmp = (stack_elem_t*)realloc(s->elems,
s->capacity * * sizeof(stack_elem_t));
s->capacity *= ;
s->elems = tmp;
}
s->elems[s->size++] = x;
} /**
* @brief 进栈.
* @param[in] s 栈对象的指针
* @return 无
*/
void stack_pop(stack_t *s) {
  s->size--;
} /**
* @brief 获取栈顶元素.
* @param[in] s 栈对象的指针
* @return 栈顶元素
*/
stack_elem_t stack_top(const stack_t *s) {
  return s->elems[s->size - ];
}

  注意到在push进栈的过程中,如果此时分配的栈空间已经满了,realloc内存空间为当前栈空间的两倍。

  realloc(指向该内存的指针,重新分配内存大小);使用realloc时应格外小心,因为当重新分配内存大小小于原来内存大小的时候,可能导致数据的丢失。

栈的C语言实现的更多相关文章

  1. 大数据全栈式开发语言 – Python

    前段时间,ThoughtWorks在深圳举办一次社区活动上,有一个演讲主题叫做“Fullstack JavaScript”,是关于用JavaScript进行前端.服务器端,甚至数据库(MongoDB) ...

  2. 为什么说Python 是大数据全栈式开发语言

    欢迎大家访问我的个人网站<刘江的博客和教程>:www.liujiangblog.com 主要分享Python 及Django教程以及相关的博客 交流QQ群:453131687 原文链接 h ...

  3. 数据结构——栈(C语言实现)

    #include <stdio.h> #include <stdlib.h> #include<string.h> #include<malloc.h> ...

  4. 【数据结构】之栈(Java语言描述)

    在前面的[这篇文章]中,我简单介绍了栈这种数据结构的操作功能,并使用C语言对其进行了代码的编写. Java的JDK中默认为我们提供了栈这种数据结构的API—— Stack . Java中的Stack类 ...

  5. 【数据结构】之栈(C语言描述)

    栈(Stack)是编程中最常用的数据结构之一. 栈的特点是“后进先出”,就像堆积木一样,堆的时候要一块一块堆到最上面,拆的时候需要从最上面一块一块往下拆.栈的原理也一样,只不过它的操作不叫堆和拆,而是 ...

  6. 栈在go语言中实现,及解决388.文件的最长绝对路径的思路

    今天在LeetCode刷每日一题,遇到了388. 文件的最长绝对路径的思路,这道题让我想到了系统的目录是栈结构,果然在题解中找到了栈的解法(暴力半天没出来,跑去看题解了QWQ). 所以我就捎带复习了一 ...

  7. 链栈的C语言实现

    /* 功能:栈的链表实现 Author:lxm Date: 20160511 */ #include <stdio.h> #include <stdlib.h> #define ...

  8. [置顶] 栈/入栈/出栈顺序(c语言)-linux

    说明: 1.栈底为高地址,栈顶为低地址. 2.入栈顺序:从右到左. 解释1:栈在内存中的结构 [注:0x00 到 0x04之间间隔4个地址] 入栈:指针先指向0x10,从高地址向低地址方向填数值,最终 ...

  9. 表达式求值(栈方法/C++语言描述)(二)

    上篇中完成了对表达式求值的整体过程,接下来看看如何处理不同类型的token. 对运算数的处理比较简单,它直接调用函数strtod(),将字符串中的运算数转换为浮点类型并将它压入运算数栈中: void ...

随机推荐

  1. 系统学习NLP(二十一)--SWEM

    https://blog.csdn.net/App_12062011/article/details/88655589 这篇发表在 ACL 2018 上的论文来自于杜克大学 Lawrence Cari ...

  2. 了解 JavaScript (3)- 马上开始

    之前演示了一个 Hello World 程序,而后讲解了一些基础概念,下面开始一些基础工作. 将脚本放在哪里 脚本可以放置在两个位置 <head></head>之间,头脚本(h ...

  3. 常用CTPN、CRNN文本检测识别框架

    一.SWT识别: yestinsong/Text-Detection( Text Detection System with MSER , SWT and Text Verification(fft ...

  4. Java字节码 小结

    Reference javap 基本使用方法 深入理解java字节码 从Java代码到字节码 Java字节码.class文件案例分析 字节码 核心概念 Class文件是8位字节流,按字节对齐.之所以称 ...

  5. oracle访问不同用户的表不添加用户名前缀

    问题的出现,是技术的不断推进.为了更好地实现价值的提升! 01.用视图 create view tab1 select * from B.tab1;       //在A用户下执行 02.同义词 gr ...

  6. PEM文件

    原文链接: http://blog.sina.com.cn/s/blog_489f88710100a59w.html OpenSSL 使用 PEM 文件格式存储证书和密钥.PEM 实质上是 Base6 ...

  7. nodeJs--模块module.exports与实例化方法

    在nodejs中,提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象.而在e ...

  8. 每日英语:Mrs. Obama Takes Stab at Ping-Pong Diplomacy

    U.S. first lady Michelle Obama took ping-pong diplomacy to a new level on Friday on her weeklong tou ...

  9. Roller5.0.3安装配置部署 step by step

    一.下载roller 下载地址:http://roller.apache.org/downloads/downloads.html下载下来之后,解压包含两部份doc.webapps 二.准备环境 1. ...

  10. Git应用实践(一)

    [时间:2017-03] [状态:Open] [关键词:Git,ssh,远程仓库,git remote] 0-背景 近期在使用Git@oschina上发现以下两个问题: 我的提交有两个名和email, ...