栈的C语言实现
在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语言实现的更多相关文章
- 大数据全栈式开发语言 – Python
前段时间,ThoughtWorks在深圳举办一次社区活动上,有一个演讲主题叫做“Fullstack JavaScript”,是关于用JavaScript进行前端.服务器端,甚至数据库(MongoDB) ...
- 为什么说Python 是大数据全栈式开发语言
欢迎大家访问我的个人网站<刘江的博客和教程>:www.liujiangblog.com 主要分享Python 及Django教程以及相关的博客 交流QQ群:453131687 原文链接 h ...
- 数据结构——栈(C语言实现)
#include <stdio.h> #include <stdlib.h> #include<string.h> #include<malloc.h> ...
- 【数据结构】之栈(Java语言描述)
在前面的[这篇文章]中,我简单介绍了栈这种数据结构的操作功能,并使用C语言对其进行了代码的编写. Java的JDK中默认为我们提供了栈这种数据结构的API—— Stack . Java中的Stack类 ...
- 【数据结构】之栈(C语言描述)
栈(Stack)是编程中最常用的数据结构之一. 栈的特点是“后进先出”,就像堆积木一样,堆的时候要一块一块堆到最上面,拆的时候需要从最上面一块一块往下拆.栈的原理也一样,只不过它的操作不叫堆和拆,而是 ...
- 栈在go语言中实现,及解决388.文件的最长绝对路径的思路
今天在LeetCode刷每日一题,遇到了388. 文件的最长绝对路径的思路,这道题让我想到了系统的目录是栈结构,果然在题解中找到了栈的解法(暴力半天没出来,跑去看题解了QWQ). 所以我就捎带复习了一 ...
- 链栈的C语言实现
/* 功能:栈的链表实现 Author:lxm Date: 20160511 */ #include <stdio.h> #include <stdlib.h> #define ...
- [置顶] 栈/入栈/出栈顺序(c语言)-linux
说明: 1.栈底为高地址,栈顶为低地址. 2.入栈顺序:从右到左. 解释1:栈在内存中的结构 [注:0x00 到 0x04之间间隔4个地址] 入栈:指针先指向0x10,从高地址向低地址方向填数值,最终 ...
- 表达式求值(栈方法/C++语言描述)(二)
上篇中完成了对表达式求值的整体过程,接下来看看如何处理不同类型的token. 对运算数的处理比较简单,它直接调用函数strtod(),将字符串中的运算数转换为浮点类型并将它压入运算数栈中: void ...
随机推荐
- eclipse Specified VM install not found: type Standard VM, name
运行ant的时候出现 Specified VM install not found: type Standard VM, name.... 尝试删除这些文件: ... / .metadata / .p ...
- hive 字段名称显示
首先查看一个sql 1.首先存在一个数据表tmp CREATE TABLE tmp( platform string, channel string, chan_value string, uid s ...
- libmongoc关于\$pullAll和\$addToSet的一个使用问题记录
问题描述及测试结果 在使用mongodb时,对一个document中的数组成员进行更新的时候,可以使用$pull $push $pop $addToSet $pullAll和$each $positi ...
- 移除list中null元素
查询结果为null, list.size()却是1 移除该null元素 totalList.removeAll(Collections.singleton(null));
- [Android App]IFCTT,即:If Copy Then That,一个基于IFTTT的"This"实现
IFCTT,即:If Copy Then That,是一个基于IFTTT(If This Then That)的"This"实现,它打通了"用户手机端操作"与& ...
- flutter 环境安装以及配置
首先需要下载flutter源码,以下是github地址: https://github.com/flutter/flutter 然后需要安装git环境吧,下图红框可以自行下载安装 接下来需要安装flu ...
- BW中DSO的分类及应用
1.DSO的分类,标准DSO(生成主数据标识.对于相同关键字段的值进行合并.可直接出具报表).写优化的DSO(不生成主数据标识.不合并相同关键字段的值.速度快可用于存储大容量数据).直接写入的DSO, ...
- Android Launcher分析和修改12——Widget列表信息收集
很久没写Launcher分析的文章,最近实在太忙.今天七夕本来是想陪女朋友逛街 ,碰巧打台风呆在家里,就继续写一篇文章.今天主要是讲一下Launcher里面的Widget列表,这方面信息比较多,今天重 ...
- Go Revel - app.conf
##概览 `app.conf`为应用程序的配置文件,它使用`goconfig`的语法,与windows的ini文件类似. 示例: app.name=chat app.secret=pJLzyoiDe1 ...
- (笔记)AT91SAM9260的启动过程详细解说
Bootstrap的启动过程 一. 说明: Bootstrap启动代码是官方提供的一级启动代码,包括汇编和C语言两部分组成.对AT91SAM9260来说编译完成后,代码长度必须小于4KB,烧写到dat ...