栈的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 ...
随机推荐
- 快速排序partition过程常见的两种写法+快速排序非递归实现
这里不详细说明快速排序的原理,具体可参考here 快速排序主要是partition的过程,partition最常用有以下两种写法 第一种: int mypartition(vector<int& ...
- Oracle更改redo log的大小
因为数据仓库ETL过程中,某个mapping的执行时间超过了一个小时, select event,count(*) fromv$session_wait group by event order by ...
- 美化你的GRUB,全面支持中文(菜单、提示、帮助)适用7.04-9.04
本文根据网络资料整理而成,在此鸣谢各位作者. 本方法适合 7.04-9.04版本,9.10使用了grub2,请看这里. http://forum.ubuntu.org.cn/viewtopic.php ...
- Sql Server查询性能优化之不可小觑的书签查找
小小程序猿SQL Server认知的成长 1.没毕业或工作没多久,只知道有数据库.SQL这么个东东,浑然分不清SQL和Sql Server Oracle.MySql的关系,通常认为SQL就是SQL S ...
- SNF快速开发平台WinForm-CS甘特图
我们在做项目当中会经常用到按时间进度查看任务,其通过条状图来显示项目,进度,和其他时间相关的系统进展的内在关系随着时间进展的情况. 甘特图包含以下三个含义: 1.以图形或表格的形式显示活动: 2.通用 ...
- (3) MySQL分区表使用方法
1. 确认MySQL服务器是否支持分区表 命令: show plugins; 2. MySQL分区表的特点 在逻辑上为一个表,在物理上存储在多个文件中 HASH分区(HASH) HASH分区的特点 根 ...
- idea 添加项目到svn
version control 改变项目为svn管理 如图 分享 share dic 添加新地址 share 剩下的 就是设置忽略目录 提交
- 3. Tensorflow生成TFRecord
1. Tensorflow高效流水线Pipeline 2. Tensorflow的数据处理中的Dataset和Iterator 3. Tensorflow生成TFRecord 4. Tensorflo ...
- JVM——垃圾回收(GC)
GC简单介绍 java语言执行在java虚拟机(jvm)上.为了解决有限的空间和性能的保证这个矛盾体,jvm所具备的GC能力.能够有效的清除不用的对象.使空间的利用更加合理.以下介绍该机制的原理. 推 ...
- Socket阻塞模式和非阻塞模式的区别
简单点说: 阻塞就是干不完不准回来, 非组赛就是你先干,我现看看有其他事没有,完了告诉我一声 我们拿最常用的send和recv两个函数来说吧... 比如你调用send函数发送一定的Byte,在系 ...