我在面前一篇博客《C语言实现使用静态数组来构造栈结构》中使用了静态数组来模拟栈的操作。静态数组的大小是在代码中写死的。是存储在用户栈上面的,使用起来不灵活。在这篇博客中我会使用动态数组来构造。此时使用的内存是动态申请的。仅仅是在数组的创建和释放上面有区别,其它的使用都一样。注意:动态申请的内存须要我们手动去释放。由于这些占用的内存是在执行时堆上。不会在程序退出后释放。而存放在栈上面的会在程序退出后自己主动释放。代码上传至 https://github.com/chenyufeng1991/Stack_DynamicArray 。

(1)创建栈

//创建栈。也就是为数组分配数组
void createStack(int size){
if (staticSize == 0) {
staticSize = size;
stack = (int *)malloc(staticSize * sizeof(int));
if (stack == NULL) {
printf("数组内存分配失败\n");
}
}
}

(2)销毁栈

//销毁这个栈,重点是释放这个栈占用的内存
void destroyStack(){
if (staticSize > 0) {
staticSize = 0;
free(stack);
stack = NULL;//数组置空
top_element = -1;//指针置空
}
}

(3)其它基本操作

//压入元素
void push(int value){
if (!isFull()) {
stack[++top_element] = value;
}
} //弹出元素
void pop(){
if (!isEmpty()) {
top_element--;
}
} //取栈顶元素
int top(){
if (!isEmpty()) {
return stack[top_element];
} return -32768;
} //判空
int isEmpty(){
return top_element == -1;
} //判满
int isFull(){
return top_element == staticSize - 1;
} //从栈顶開始打印元素
void printStack(){ int i = top_element;
printf("打印出动态数组堆栈里面的值: ");
if(i == -1){
printf("这是个空栈");
}else{
while(i!= -1){
printf("%d ",stack[i--]);
}
}
printf("\n");
}

(4)測试代码

int main(int argc, const char * argv[]) {

    createStack(50);
printStack(); push(6);push(3);push(9);push(1);push(4);
printf("栈中压入数据后:\n");
printStack();
pop();pop(); printf("弹出数据后。栈内的元素为:\n");
printStack(); printf("取栈顶的元素:%d\n",top()); destroyStack();
printStack(); return 0;
}

C语言实现使用动态数组来构造栈结构的更多相关文章

  1. C语言基础 - 实现动态数组并增加内存管理

    用C语言实现一个动态数组,并对外暴露出对数组的增.删.改.查函数 (可以存储任意类型的元素并实现内存管理) 这里我的编译器就是xcode 分析: 模拟存放 一个 People类 有2个属性 字符串类型 ...

  2. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

  3. 二 基于java动态数组手写栈

    package dataStucture2.stack; import dataStucture2.array.MyDynamicArray; /** * 基于动态数组手写栈 * 设计时,栈中仅栈顶对 ...

  4. 数据结构笔记--栈的总结及java数组实现简单栈结构

    杂谈"栈"结构: 栈(Stack)是一种插入删除操作都只能在一个位置上进表,这个位置位于表的末端,叫做栈顶(Top). 对栈的基本操作有push和pop,表示进栈和出栈.也就相当于 ...

  5. C语言实现使用动态数组实现循环队列

    我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作. 因为数组的大小已经被指定.无法动态的扩展. 所以在这篇博客中,我换成动态数组来实现. 动态数组能 ...

  6. 基于自定义的动态数组实现一个栈(Java语言)

    关于动态数组,参见我的上一篇关于动态数组的博文https://www.cnblogs.com/inu6/p/11717129.html 1.什么是栈? (1)只能从一端添加元素,也只能从一端取出元素, ...

  7. 纯C语言(C89)实现动态数组

    起因 工作很少接触纯C项目,业余写着玩玩,不断雕琢 目标 纯C实现动态数组,提供方便易用泛型接口,避免依赖 实现 完全封装,隐藏结构体细节,不支持栈创建 拷贝存储,轻微性能代价换来易用性 vector ...

  8. 使用java语言实现一个动态数组(详解)(数据结构)

    废话不多说,上代码 1.从类名开始(我真是太贴心了) public class Array<E> 首先数组类需要带有泛型,这个不多说.需要注意的是在java中,数组只能存放同一个类型的. ...

  9. python构造栈结构

    栈:是一种先进后出的数据结构:本片文章,我们用python的面向对象来构造这样的数据结构. 栈中的每一个数据除了存储当前的数值外,还存储着当前数值下一个数据的类型(注意不是下一个数据的数值). cla ...

随机推荐

  1. 【2017 Multi-University Training Contest - Team 6】Kirinriki

    [链接]http://acm.hdu.edu.cn/showproblem.php?pid=6103 [题意] 给出一串字符串,从中选出两个不重叠的字符串,使得两个字符串的距离和 <= m 的最 ...

  2. wechat4j框架具体解释

    发送消息: 基于上面access_token的逻辑,在构造发送消息对象的时候请依照例如以下代码. wechat4j和微信强力推荐的方法 CustomerMsg customerMsg = new Cu ...

  3. Elasticsearch和MongoDB

    Elasticsearch和MongoDB分片及高可用对比 本文旨在对比Elasticsearch和MongoDB高可用和分片的实现机制. Elasticsearch ES天生就是分布式的,那她又是如 ...

  4. Python 极简教程(四)变量与常量

    变量和常量 在 Python 中没有 常量 与 变量 之分.只有约定成俗的做法: 全大写字母的名称即为 常量: PI = 3.1415926 全小写字母的名称为 变量: name = 'nemo' 变 ...

  5. 微服务实战(六):选择微服务部署策略 - DockOne.io

    原文:微服务实战(六):选择微服务部署策略 - DockOne.io [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺点.随后的文章讨论了微服务不同 ...

  6. Linear to physical address translation with support for page attributes

    Embodiments of the invention are generally directed to systems, methods, and apparatuses for linear ...

  7. linux cmd cp -a

    cp -a 在保留原文件属性的前提下复制文件    cp -r dirname destdir   复制目录后其文件属性会发生变化 想要使得复制之后的目录和原目录完全一样,可以使用cp -a dirn ...

  8. Altium Designer如何重命名文件

  9. vscode markdown-all-in-one 源码编译成vsix

    https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one 有链接 Download Extensio ...

  10. 9.6 Binder系统_驱动情景分析_server的多线程实现

    当多个client对server发出请求的时候,如果server忙不过来的时候会创建多线程来处理请求 那么忙不过来由谁来判断? server进程有个binder_proc结构体,其里面有todo链表( ...