7.3 C/C++ 实现顺序栈
顺序栈是一种基于数组实现的栈结构,它的数据元素存储在一段连续的内存空间中。在顺序栈中,栈顶元素的下标是固定的,而栈底元素的下标则随着入栈和出栈操作的进行而变化。通常,我们把栈底位置设置在数组空间的起始处,这样在进行入栈和出栈操作时,只需要维护栈顶指针即可。
顺序栈的实现比较简单,它只需要一个数组和一个整型变量top即可。其中,数组用于存储栈中的元素,top则用于记录当前栈顶元素在数组中的位置。当进行入栈操作时,我们将要入栈的元素放在数组的top位置,然后将top加1;当进行出栈操作时,我们先将top减1,然后返回top位置的元素值即可。
顺序栈的优点是实现简单,访问速度快,因为栈中元素的存储是连续的,所以访问任意一个元素的时间复杂度为O(1)。缺点是容量有限,因为它的存储空间是预先分配的,一旦存储空间满了就无法继续入栈,需要重新分配更大的存储空间并将原来的元素复制到新的存储空间中,这样会增加时间和空间的开销。
读者需自行创建头文件seqstack.h并拷贝如下顺序栈代码实现;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1024
typedef void * SeqStack;
struct SStack
{
void *data[MAX]; // 存放栈元素
int size; // 栈中元素个数
};
// 初始化一个顺序栈
SeqStack InitSeqStack()
{
struct SStack *stack = malloc(sizeof(struct SStack));
// 如果stack指针不为空,则将栈初始化一下
if (stack != NULL)
{
stack->size = 0;
for (int i = 0; i < MAX; ++i)
{
stack->data[i] = NULL;
}
}
return stack;
}
// 入栈
void PushSeqStack(SeqStack stack, void *data)
{
if (stack == NULL || data == NULL)
{
return;
}
struct SStack *s = (struct SStack *)stack;
if (s->size == MAX)
{
return;
}
s->data[s->size] = data;
s->size++;
}
// 出栈
void PopSeqStack(SeqStack stack)
{
if (NULL == stack)
{
return;
}
struct SStack *s = (struct SStack *)stack;
if (s->size == 0)
{
return;
}
s->data[s->size - 1] = NULL;
s->size--;
}
// 获得栈顶元素
void *TopSeqStack(SeqStack stack)
{
if (NULL == stack)
{
return 0;
}
struct SStack *s = (struct SStack *)stack;
if (s->size == 0)
{
return 0;
}
return s->data[s->size - 1];
}
// 获得栈的大小
int SizeSeqStack(SeqStack stack)
{
if (NULL == stack)
{
return -1;
}
struct SStack *s = (struct SStack *)stack;
return s->size;
}
// 销毁栈
void DestroySeqStack(SeqStack stack)
{
if (NULL != stack)
{
free(stack);
}
return;
}
主函数调用如下所示,首先定义一个Student结构体,接着通过使用InitSeqStack函数对栈进程初始化,分别使用PushSeqStack函数向栈中压入不同的参数,最后通过使用循环的方式遍历出栈中的元素,最终调用DestroySeqStack函数销毁栈。
#include "seqstack.h"
struct Student
{
int uid;
char name[64];
};
int main(int argc, char *argv[])
{
// 初始化栈,默认分配空间为1024
SeqStack stack = InitSeqStack();
// 穿件一些测试数据
struct Student stu1 = { 1001, "admin" };
struct Student stu2 = { 1002, "guest" };
struct Student stu3 = { 1003, "lyshark" };
// 将输入加入到栈中
PushSeqStack(stack, &stu1);
PushSeqStack(stack, &stu2);
PushSeqStack(stack, &stu3);
// 循环输出栈顶元素
while (SizeSeqStack(stack) > 0)
{
// 获得栈顶元素
struct Student *ptr = (struct Student *)TopSeqStack(stack);
printf("Uid: %d --> Name: %s \n", ptr->uid, ptr->name);
printf("当前栈大小: %d \n", SizeSeqStack(stack));
PopSeqStack(stack);
}
// 销毁栈
DestroySeqStack(stack);
stack = NULL;
system("pause");
return 0;
}
7.3 C/C++ 实现顺序栈的更多相关文章
- 数据结构:C_顺序栈的实现
数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...
- D_S 顺序栈的基本操作
// main.cpp #include <iostream> using namespace std; #include "Status.h" typedef in ...
- 数据结构Java实现05----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- 01顺序栈_Stack---(栈与队列)
#include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...
- 把十进制整数转换为r(r=2)进制输出(顺序栈实现)
上周的第二个作业补上~~ 上周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1) 初始化顺序栈 2) 实现入栈和出栈操作 3) 实现取栈顶元素 ...
- 数据结构之顺序栈SqStack
顺序栈SqStack 基本操作 Status InitStack()//构造一个空栈S Status DestroyStack()//销毁栈S,S不再存在 Status ClearStack()//把 ...
- 顺序栈之C++实现
顺序栈就是用顺序表(数组)实现的栈.其组织形式如下图所示: 下面介绍下我用C++实现的顺序栈,在VC6下调试通过.不足之处还请指正. 1.文件组织 2.ss.h栈类的声明及宏的定义 #ifndef _ ...
- 顺序栈和链式栈(C++实现)
顺序栈,是一种基于数组的存储表示. 实现类代码如下: template<class T> class SeqStack{ T *element; int top; int maxSize; ...
- salesforce零基础学习(七十六)顺序栈的实现以及应用
数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...
- 【小白成长撸】--顺序栈(C语言版)
// 顺序栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h"//test1.0--栈表仅限Int类型 #include <stdio. ...
随机推荐
- 【redis】 redis linux下安装 redis启动方式 redis典型场景 redis通用命令 数据结构和内部编码 redis字符串类型
目录 上节回顾 今日内容 1 redis介绍 2 redis linux下安装 3 redis启动方式 3.1 最简启动 3.2 动态参数启动 3.3 配置文件启动 3.4 客户端连接命令 4 red ...
- LayUI多文件上传,支持历史上传预览
记录一次项目开发中,LayUI多个图片进行优化,需要支持多个图片上传.可删除某一个图片.支持加载上次上次图片. 页面代码: <div class="layui-upload" ...
- SELinux 入门 pt.1
哈喽大家好,我是咸鱼 文章<SELinux 导致 Keepalived 检测脚本无法执行>以[keepalived 无法执行检测脚本]为案例向大家简单介绍了关于 SELinux 的一些概念 ...
- SpringBoot 项目实战 | 瑞吉外卖 Day01
一.软件开发整体介绍 1.软件开发流程 2.角色分工 项目经理:对整个项目负责,任务分配.把控进度 产品经理:进行需求调研,输出需求调研文档.产品原型等 UI设计师:根据产品原型输出界面效果图 架构师 ...
- 5G“乍到”,图扑带你了解室内定位可视化的实现与新突破
前言 现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 ...
- kafka搭建 一、单机版
系列导航 一.kafka搭建-单机版 二.kafka搭建-集群搭建 三.kafka集群增加密码验证 四.kafka集群权限增加ACL 五.kafka集群__consumer_offsets副本数修改 ...
- freeswitch的事件引擎实现分析
概述 freeswitch是由事件驱动的,fs内部有各种事件来标识状态的变化包括呼叫的变化.配置的变化.号码的变化等等. 而一个框架内的事件引擎需要实现哪些基本的功能呢? 让我们来看一下fs的事件引擎 ...
- freeswitch修改mod_sofia模块并上报自定义头域
概述 在之前的文章中,我们介绍了如何使用fs的event事件机制来获取呼叫的各种信息. 这些event事件一般都是底层模块定义好的,其中的各种信息已经很完备了,日常的开发需求都可以满足. 但是,总有一 ...
- linux tcpdump 使用小结(一)
转载请注明出处: 很多情况在服务联调和定位过程中,需要在服务器上进行抓包进行问题定位.在Linux环境上使用tcpdump命令进行抓包: 1.tcpdump -s 0 -l -i any -w - p ...
- 域名解析类型及dig,nslookup进行Dns解析过程查看
本文为博主原创,未经允许不得转载: 通常我们在windows系统下查看域名是不是可以正常访问,是通过cmd命令打开dos窗口,使用ping 命令来查看域名是不是可以正常访问,使用 ping 命令正常访 ...