数据结构 | 顺序栈

news2025/1/13 6:00:43

一、数据结构定义

typedef int StackType;
typedef struct seqStack{
    int MAXNUM;     // 最大元素个数    
    int top;        // 栈顶位置,初始化为0或-1
    StackType element[100]; // 元素的连续空间的起始地址  
} *SeqStack;

二、方法概览

SeqStack CreateSqlStack(int m); //创建空顺序栈
int IsStackEmpty(SeqStack L);   //判断栈是否为空
int IsStackFull(SeqStack L);    //判断栈是否已满
int PushStack(SeqStack L, StackType x); //入栈
StackType PopStack(SeqStack L);         //出栈
StackType GetStackTop(SeqStack L);      //取栈顶元素
int DestroyStack(SeqStack L);   //销毁栈

三、方法详解

// 创建空顺序栈
SeqStack CreateSqlStack(int m) {
    if (m == 0) return NULL;
    else {
        struct seqStack* stack = (struct seqStack*)malloc(sizeof(struct seqStack));
        stack->MAXNUM = m;
        stack->top = 0;
        return stack;
    }
}
// 判断栈是否为空
int IsStackEmpty(SeqStack L) {
    // 若栈不存在,则返回-1
    if (L == NULL) return -1;
    // 若为空,返回值为1,否则返回值为0
    else if (L->top == 0) return 1;
    else return 0;
}
// 判断栈是否已满
int IsStackFull(SeqStack L){
    //若已满,返回值为1,否则返回值为0
    if (L->top == L->MAXNUM) return 1;
    else return 0;
}
// 入栈
int PushStack(SeqStack L, StackType x) {
    // 若插入不成功,返回0;插入成功返回值为1
    if (IsStackFull(L))  return 0;
    else {
        L->element[L->top] = x;
        L->top = L->top + 1;
        return 1;
    }
}
//出栈
StackType PopStack(SeqStack L) {
    // 若栈为空,则返回-1
    if (IsStackEmpty(L))  return -1;
    else {
        int del = L->element[L->top - 1];
        L->top--;
        return del;
    }
}
//取栈顶元素
StackType GetStackTop(SeqStack L) {
    // 若栈为空,则返回-1
    if (IsStackEmpty(L))  return -1;
    else return L->element[L->top - 1];
}
//销毁栈
int DestroyStack(SeqStack L){
    // 返回销毁栈中元素个数,若待销毁栈不存在返回-1
    if (L == NULL) return -1;
    else {
        int num = L->top;
        L->top = 0;
        return num;
    }
}

四、运行结果

        利用栈结构实现进制转换,转换进制可以为2、8、16进制,转换函数如下:

// 利用栈将data转换为k进制,k可能是2,8,16
void ConvertData(int data, int k){
    SeqStack L = CreateSqlStack(50);
    int temp = 0;
    while (data != 0) {
        temp = data % k;
        data = data / k;
        PushStack(L, temp);
    }
    while (!IsStackEmpty(L)) {
        temp = GetStackTop(L);
        PopStack(L);
        if (temp == 10) printf("A");
        else if (temp == 11) printf("B");
        else if (temp == 12) printf("C");
        else if (temp == 13) printf("D");
        else if (temp == 14) printf("E");
        else if (temp == 15) printf("F");
        else printf("%d", temp);
    }
}

        main方法代码如下:

int main() {
    ConvertData(33324, 16);
}

       运行结果如下:

 

五、源代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

/* 顺序栈 */
typedef int StackType;
typedef struct seqStack{
    int MAXNUM;     // 最大元素个数    
    int top;        // 栈顶位置,初始化为0或-1
    StackType element[100]; // 元素的连续空间的起始地址  
} *SeqStack;

SeqStack CreateSqlStack(int m); //创建空顺序栈
int IsStackEmpty(SeqStack L);   //判断栈是否为空
int IsStackFull(SeqStack L);    //判断栈是否已满
int PushStack(SeqStack L, StackType x); //入栈
StackType PopStack(SeqStack L);         //出栈
StackType GetStackTop(SeqStack L);      //取栈顶元素
int DestroyStack(SeqStack L);   //销毁栈

// 创建空顺序栈
SeqStack CreateSqlStack(int m) {
    if (m == 0) return NULL;
    else {
        struct seqStack* stack = (struct seqStack*)malloc(sizeof(struct seqStack));
        stack->MAXNUM = m;
        stack->top = 0;
        return stack;
    }
}
// 判断栈是否为空
int IsStackEmpty(SeqStack L) {
    // 若栈不存在,则返回-1
    if (L == NULL) return -1;
    // 若为空,返回值为1,否则返回值为0
    else if (L->top == 0) return 1;
    else return 0;
}
// 判断栈是否已满
int IsStackFull(SeqStack L){
    //若已满,返回值为1,否则返回值为0
    if (L->top == L->MAXNUM) return 1;
    else return 0;
}
// 入栈
int PushStack(SeqStack L, StackType x) {
    // 若插入不成功,返回0;插入成功返回值为1
    if (IsStackFull(L))  return 0;
    else {
        L->element[L->top] = x;
        L->top = L->top + 1;
        return 1;
    }
}
//出栈
StackType PopStack(SeqStack L) {
    // 若栈为空,则返回-1
    if (IsStackEmpty(L))  return -1;
    else {
        int del = L->element[L->top - 1];
        L->top--;
        return del;
    }
}
//取栈顶元素
StackType GetStackTop(SeqStack L) {
    // 若栈为空,则返回-1
    if (IsStackEmpty(L))  return -1;
    else return L->element[L->top - 1];
}
//销毁栈
int DestroyStack(SeqStack L){
    // 返回销毁栈中元素个数,若待销毁栈不存在返回-1
    if (L == NULL) return -1;
    else {
        int num = L->top;
        L->top = 0;
        return num;
    }
}


// 利用栈将data转换为k进制,k可能是2,8,16
void ConvertData(int data, int k){
    SeqStack L = CreateSqlStack(50);
    int temp = 0;
    while (data != 0) {
        temp = data % k;
        data = data / k;
        PushStack(L, temp);
    }
    while (!IsStackEmpty(L)) {
        temp = GetStackTop(L);
        PopStack(L);
        if (temp == 10) printf("A");
        else if (temp == 11) printf("B");
        else if (temp == 12) printf("C");
        else if (temp == 13) printf("D");
        else if (temp == 14) printf("E");
        else if (temp == 15) printf("F");
        else printf("%d", temp);
    }
}

int main() {
    ConvertData(33324, 16);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/703669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【服务器数据恢复】ZFS文件系统下raid5数据恢复案例

服务器数据恢复环境&#xff1a; 某公司一台EMC某型号存储中有一组由12块硬盘组建的raid5磁盘阵列&#xff0c;其中有2块盘作为热备盘使用。 服务器故障&分析&#xff1a; raid5磁盘阵列中有2块磁盘离线&#xff0c;只有1块热备盘成功启用&#xff0c;另外一块热备盘未启用…

Elastic 栈中的 Kibana安装

Kibana 是一个开源分析和可视化平台&#xff0c;旨在与 Elasticsearch 协同工作。 你使用 Kibana 搜索&#xff0c;查看和与存储在 Elasticsearch 索引中的数据进行交互。 你可以轻松执行高级数据分析&#xff0c;并在各种图表&#xff0c;表格和地图中可视化你的数据。 官方链…

文件批量下载方法 文件批量下载工具

软件版本&#xff1a;Internet Download Manager 在当今数字化时代&#xff0c;我们日常使用电脑进行各种工作和娱乐活动。有时候&#xff0c;我们需要从互联网上下载大量文件&#xff0c;例如电影、音乐、文档等。在这种情况下&#xff0c;手动逐个下载文件将变得繁琐而耗时。…

梯度下降法求函数的解

题目 例如 y x^ 5 e^x3x−3&#xff0c;求解y 0的解 问题分析 首先要构造y 0的损失函数&#xff0c;让这个损失函数是凸的&#xff0c;也就是可以有最优解&#xff0c;并且是可到的&#xff0c;比较容易想到的是mse平方误差&#xff0c;我们要让y和0之间绝对误差最小。lo…

变压器铜铝材质分析仪技术参数

一、主要技术指标 1.输入特性 有源部分&#xff1a; 电压测量范围&#xff1a;0~10V 电流测量范围&#xff1a;0~10A 无源部分&#xff1a; 电压测量范围&#xff1a;0~750V 宽量限&#xff08;可以外接电压互感器&#xff09;。 电流测量范围&#xff1a;0~100A内部自动…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 28 日论文合集)

文章目录 一、检测相关(6篇)1.1 Detector-Free Structure from Motion1.2 Irregular Change Detection in Sparse Bi-Temporal Point Clouds using Learned Place Recognition Descriptors and Point-to-Voxel Comparison1.3 Transferability Metrics for Object Detection1.4 …

【超全面】Linux嵌入式干货学习系列教程

文章目录 一、前言二、Linux基础篇三、数据结构与算法基础三、Linux应用篇四、Linux网络篇五、ARM篇六、Linux系统移植篇七、Linux驱动篇八、Linux特别篇九、Linux项目篇 一、前言 博主学习Linux也有几个月了&#xff0c;在这里为广大朋友整理出嵌入式linux的学习知识&#xff…

精彩回顾 | 迪捷软件亮相2023飞机航空电子国际论坛

2023年6月29日&#xff0c;2023&#xff08;第十二届&#xff09;飞机航空电子国际论坛&#xff08;以下简称论坛&#xff09;在上海市圆满落幕。论坛由中国航空学会、中国航空研究院、中航机载系统有限公司共同主办&#xff0c;中国航空无线电电子研究所、航空电子系统综合技术…

SpringCloud-Gateway网关全悉

1&#xff09;概述 使用说明文档 其他版本api文档请自由查阅&#xff1a; https://spring.io/projects/spring-cloud-gateway#learn 1.1&#xff09;是什么 Cloud全家桶中有个很重要的组件就是api网关&#xff0c;在1.x版本中都是采用的Zuul网关&#xff0c;但在2.x版本中&a…

【Logback技术专题】「入门到精通系列教程」深入探索Logback日志框架的原理分析和开发实战技术指南(下篇)

深入探索Logback日志框架的原理分析和开发实战技术指南&#xff08;下篇&#xff09; 根节点configuration包含的属性基本参数详解子节点介绍设置上下文名称<contextName>使用案例 设置变量属性值<property>获取时间戳字符串<timestamp>设置loggerroot根节点…

CDH 之 Hive 中文乱码平定通用法则

一、乱象 1.1 中文注释乱码 hive> DESCRIBE test; OK # col_name data_type comment id string ??ID ?? pcs string ????? …

java实现远程执行Linux下的shell脚本

java实现远程执行Linux下的shell脚本 背景导入Jar包第一步&#xff1a;远程连接第二步&#xff1a;开启Session第三步&#xff1a;新建测试脚本文件结果报错 背景 最近有个项目&#xff0c;需要在Linux下的服务器内写了一部分Python脚本&#xff0c;业务处理却是在Java内&…

采用三五555时基电路的简易/自动温度控制器电路设计

采用 555 时基电路的简易温度控制器 本电路是采用555时基集成电路和很少的外围元件组成的一个温度自动控制器。因为电路中各点电压都来自同一-直流电源&#xff0c;所以不需要性能很好的稳压电源&#xff0c;用电容降压法便能可靠地工作。电路元件价格低、体积小、便于在业余条…

喜报!Coremail实力上榜“邮件安全网关”和“反钓鱼”等三大赛道!

6月28日&#xff0c;由国内首家专业聚焦网络安全商业市场研究分析和加速服务的机构斯元商业咨询出品的「网安新兴赛道厂商速查指南|短名单精选」&#xff08;以下简称「短名单精选」&#xff09;正式出炉。 Coremail凭借出色的综合能力&#xff0c;成功上榜“邮件安全网关&…

最新导则下生态环评报告编制要求与规范

根据生态环评内容庞杂、综合性强的特点&#xff0c;依据生态环评最新导则&#xff0c;将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、10大专题(生态环评报告编制、土地利用图的制作、植被类型及植被覆盖度图的制作、物种适宜生境分布图的制作、生物多样性测定、生物量及…

Django 的 REST framework 基础知识

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录 系列文章目录前言1. 创建django项目2. 修改settings.py3. 根目录创建static文件夹4. 启动项目5. 创建数据表6. 创建一个超级管理员7. 登录django的admin后台8. 安装 REST framework9. 配置setting…

Quiz 16_3-2: Databases | Python for Everybody 配套练习_解题记录

文章目录 Python for Everybody课程简介Quiz 16_3-2: Databases单选题&#xff08;1-10&#xff09;操作题Autograder 1: Counting Email in a DatabaseAutograder 2: Multi-Table Database - Tracks Python for Everybody 课程简介 Python for Everybody 零基础程序设计&…

数据库管理-第八十七期 19c OCM之路-第一堂(02)(20230630)

第八十六期 19c OCM之路-第一堂&#xff08;02&#xff09; 本来计划是昨天写的&#xff0c;但是昨天突发膝盖筋膜炎&#xff0c;去骨科医院做了下治疗&#xff0c;前后两夜几乎无眠。本期内容主要是针对第一堂第四个考点&#xff1a;Manage application containers内容去做的…

Spring Boot中的@MessageMapping注解:原理及使用

Spring Boot中的MessageMapping注解&#xff1a;原理及使用 简介 在Web应用程序中&#xff0c;实现实时的双向通信是一项重要的功能。为了实现这种功能&#xff0c;需要使用WebSocket协议。Spring框架提供了Spring WebSocket模块来实现WebSocket通信。Spring Boot是基于Sprin…

《刷题日记03》链表

题目描述力扣https://leetcode.cn/problems/LGjMqU/ 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → … 不能只是单纯的改变节点内部的值…