数据结构之栈的顺序存储结构实现_Roger-Pang的博客-程序员信息网_实现栈的顺序存储结构

技术标签:   数据结构与算法  顺序存储  伪代码  

  • 栈的顺序存储结构实现
    栈的数据元素之间的一一对应的关系可以利用顺序的存储来表示, 那么可以利用数组来实现栈数据结构.

  • 存储结构伪代码

struct stack_record;
typedef struct stack_record * stack;

stack init_stack(int max_elements); // 初始化操作, 建立空栈
void dispose_stack(stack s); // 销毁栈
void clear_stack(stack s); // 清空栈
int is_empty(stack s); // 判断栈是否为空
int is_full(stack s); // 判断栈是否已满
element_type get_top(stack s); // 获取栈顶元素
void push(element_type element, stack s); // 入栈
void pop(stack s); // 出栈

struct stack_record {
    int capacity; // 栈的最大容量
    int top_of_stack; // 栈顶的下标
    element_type *array; // 存储元素的数组
};
  • 实现 init_stack 函数
    思路:
    step1: 创建栈记录s
    step2: 为栈记录中存储数据的数组分配内存
    step3: 设置栈的最大容量
    step4: 初始化栈顶位置
stack init_stack(int max_elements)
{
    stack s = malloc(sizeof(struct stack_record));
    if(s == NULL)
        error("Out of space.");

    s->array = malloc(sizeof(element_type) * max_elements);
    if(s->array == NULL)
        error("Out of space.");
    s->capacity = max_elements;
    s->top_of_stack = start;

    return s;
}
  • 实现 dispose_stack 函数
    思路: 先释放栈记录中存储数据的数组的内存, 再释放栈记录的内存
void dispose_stack(stack s)
{
    if(s != NULL) {
        free(s->array);
        free(s);
    }
}
  • 实现 clear_stack 函数
    思路: 将栈记录中栈顶位置设置为起始位置
void clear_stack(stack s)
{
    s->top_of_stack = start; // start等于-1
}
  • 实现 is_empty 函数
    思路: 比较栈顶是否在起始位置
bool is_empty(stack s)
{
    return s->top_of_stack == start; // start等于-1
}
  • 实现 is_full 函数
    思路: 比较栈顶是否达到栈的最大容量位置
bool is_full(stack s)
{
    return s->top_of_stack == s->capacity;
}
  • 实现 get_top 函数
    思路: 先从栈记录中获取栈顶下标, 在用下标从数组中获取数组元素
element_type get_top(stack s)
{
    if(!is_empty(s)) {
        return s->array[s->top_of_stack];
    }
    else {
        error("Empty satck!");
        return 0;
    }
}
  • 实现 push 函数
    思路: 将element的值赋给数组的top_of_stack +1的位置, 并将top_of_stack的值加1
void push(element_type element, stack s)
{
    if(is_full(s)) {
        error("Full stack!\n"};
    }
    else {
        s->array[++(s->top_of_stack)] = element;
    }
}
  • 实现 pop 函数
    思路: 将top_of_stack的值减1
void pop(stack s)
{
    if(id_empty(s)) {
        error("Empty stack!\n");
    }
    else {
        s->top_of_stack--;
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_31504597/article/details/80410898

智能推荐

通过示例使用 ethtool 命令_TAOXC(◉ɷ◉ )的博客-程序员信息网_ethtool如何使用

ethtool 命令用于显示/更改以太网适配器设置。您可以在 Linux 中使用此工具更改网卡速度、自动协商、LAN 唤醒设置、双工模式。在本文中,我将向您展示一些帮助您解决以太网卡问题的 ethtool 命令示例。1) 显示以太网接口详细信息ethtool 命令检索以太网接口的状态。输出显示etho接口的速度、双工、状态和唤醒等属性。下面给出一个例子:# ethtool eth0Settings for eth0:Supported ports: [ TP ]Supported

挑战自已_dirqq64426的博客-程序员信息网

本以为到丰台是种解脱,一种逃离办公室的办法,可是到了之后我发现我错了。丰台的工作是无聊的,每天都要求呆在那儿,但没什么事可做,吃完晚饭后就只能回招待所看电视,我怎么可能这样就渡过一个月呢?浪费时间呀!不管怎么样,我一定要想办法实现我的计划!从下周开始必须实现我的计划,再拖下去我会死掉的呀......挑战自已!转载于:https://www.cnblogs.com/GaoJunTao/...

CentOS 7创建用户并授权_Android_la的博客-程序员信息网_centos给用户授权

一. 问题背景搭建MySQL8.0集群的时候,按照网上的博客要创建新的用户,然而创建后,无法使用新用户进行操作(比如mkdir,rm,vim,more一些列的命令都弹出无权限),因此去了解CentOS7如何创建用户并授权,此过程中学习到的知识做下笔记。参考自:文件权限中 chmod、u+x、u、r、w、x分别代表什么CentOS 7 中添加新用户并授权二. 知识储备2.1 查看文件/文件夹的权限只需输入命令ls -l或者ll,如下:rwx可以使用二进制位串来表示,比如111表示有rwx

python写入csv不换行,python - 如何使用python pandas .to_csv附加到csv时强制换行 - 堆栈内存溢出..._鳗鱼神君的博客-程序员信息网

当附加到csv时,我的第一行是从现有的最后一行而不是新行开始的。我一直在搜索,但我只是找到了在追加模式下打开csv或在写入csv时使用追加模式的基本用法。 我无法理解这里接受的答案( to_csv追加模式不会附加到下一个新行 ),因为它似乎要求在用f.write("/n") ”)写入(“/ n”)之前打开现有文件f.write("/n") 。 这个答案( 如何将pandas数据添加到现有的cs...

JavaWeb项目连接Oracle数据库_weixin_30426957的博客-程序员信息网

参考网址:http://jingyan.baidu.com/article/0320e2c1d4dd0b1b87507b38.html既然你要链接oracle数据库 ,那么首先就是先打开我们的oracle数据库了(登陆oracle后用scoot用户登录)2第二步,就是打开我们的MyEclipse开发工具3...

ZYNQ+FPGA读取SD卡BMP图片并通过HDMI显示_Qiweiii的博客-程序员信息网_fpga读取图片

代码下载https://github.com/qiweiii-git/qwi06_sdp2hdmi代码编译1.在linux下使用./makeall.sh即可自动编译vivado工程。如何使用linux自动编译工程请参考利用Linux自动编译Vivado工程2.在Windows下打开vivado,运行source run.tcl即可自动创建工程并编译。系统框图最终显示的图片代码解...

随便推点

github的基础使用_余生之君的博客-程序员信息网

文章目录1. 账户配置本文记录如何使用github和使用技巧1. 账户配置在创建github账户后,我们需要生成公私钥来使用ssh协议来连接github。检查本地公私钥是否存在      &amp

浙大版《数据结构(第2版)》题目集-习题5.13 词频统计 (30分)_帅帅帅的阿豪的博客-程序员信息网

请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词。所谓“单词”,是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留前15个单词字符。而合法的“单词字符”为大小写字母、数字和下划线,其它字符均认为是单词分隔符。输入格式:输入给出一段非空文本,最后以符号#结尾。输入保证存在至少10个不同的单词。输出格式:在第一行中输出文本中所有不同单词的个数。注意“单词”不区分英文大小写,例如“PAT”和“pat”被认为是同一个单词。随后按照词频递减的顺

给我的Nokia3100_weixin_30393907的博客-程序员信息网

已经用了近四年了,开机关机键被我摁坏了,先是开机键(即顶上那个白色的橡胶东东)坏了,被指甲盖给顶穿了,于是扔掉后用钥匙什么呢,摁一下又可以开机了;后来,下面的那个灰色的开关也被硬硬地按掉了(把白色的橡胶去掉后可以看的见,那个东东被我给摁掉了),今天忘了及时充电,害得早上没能开机。解决方法: 1.重新换一个开机键。价格估计二十元吧,见:http://ks.cn.yahoo.com/q...

TCP 传递信息_weixin_30474613的博客-程序员信息网

什么是socket?Socket就是套接字。客户端与服务器之间通信用的。Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。以下是试验代码:(vs2005/xp试验通过)一个服务器端与客户端交互,实现客户端与服务器...

oracle导入日志出不来,Oracle 11.2.0.1执行数据泵导入导出操作,导入日志报ORA_破晓朝阳的博客-程序员信息网

http://resources.arcgis.com/zh-cn/content/kbase?fa=articleShowd=38470 ArcSDE版本:9.3.1和10 在Oracle11.2.0.1数据库使用数据泵(EXPDP、IMPDP)进行数据导入导出,在导入(IMPDP)过程中在导入日志文件报 ORA-39083: Object type INDEX failed to creaht...

Unity里的静态批处理和动态批处理_Real_JumpChen的博客-程序员信息网

内容会持续更新,有错误的地方欢迎指正,谢谢!前言Unity在运行时可以将一些物体进行合并,从而用一个绘制调用来渲染他们。这一操作,我们称之为“批处理”,能得到越好的渲染性能。Unity中内建的批处理机制所达到的效果要明显强于使用几何建模工具的批处理效果,因为,Unity引擎的批处理操作是在物体的可视裁剪操作之后进行的,处理的几何信息少很多。材质只有拥有相同材质的物体才可...

推荐文章

热门文章

相关标签