【数据结构】 顺序栈的基本操作 (C语言版)

目录

一、顺序栈

1、顺序栈的定义:

2、顺序栈的优缺点

二、顺序栈的基本操作算法(C语言)   

1、宏定义

 2、创建结构体

3、顺序栈的初始化 

4、顺序栈的入栈

5、顺序栈的出栈

6、取栈顶元素

7、栈的遍历输出

8、顺序栈的判空

9、顺序栈的判满

 10、求顺序栈长度

11、顺序栈的清空

12、顺序栈的销毁

13、数制转换

 14、括号匹配

三、顺序栈的基本操作完整代码(C语言)

 四、运行结果


一、顺序栈

1、顺序栈的定义:

顺序栈是由一维数组实现的栈,其中栈底元素的下标为0,栈顶元素的下标为n-1(n为数组大小),栈的大小在创建时确定,且在栈的生命周期内保持不变。

2、顺序栈的优缺点

顺序栈的优点:

  1. 空间利用率高:由于数组的大小在创建时确定,因此可以预先分配足够的空间,避免了频繁的内存申请和释放操作,提高了空间利用率。
  2. 存取速度快:由于栈元素在内存中连续存储,因此可以根据下标直接访问栈底元素和栈顶元素,存取速度快。
  3. 方便进行动态扩展:在某些情况下,可以在栈外再开辟一块内存空间,将栈的大小动态扩展,从而方便处理大规模的数据。

顺序栈的缺点:

  1. 内存浪费:如果预分配的数组大小过大,会造成内存浪费;如果预分配的数组大小过小,则可能会频繁地进行内存申请和释放操作,降低性能。
  2. 不适合处理动态扩展的数据:顺序栈的空间大小在创建时确定,因此无法动态扩展,对于需要处理大规模数据的情况不太适用。
  3. 不便于处理异常情况:如果栈已满而仍需添加元素,会导致栈溢出;如果栈未满而尝试删除元素,会导致栈下溢。这些异常情况的处理较为复杂。

二、顺序栈的基本操作算法(C语言)   

1、宏定义
#define OK 1
#define ERROR 0
#define MAXSIZE 100typedef char SElemType;
typedef int Status;
 2、创建结构体
typedef struct {SElemType *base;SElemType *top;int stacksize;
} SqStack;
3、顺序栈的初始化 
//初始化
Status InitStack(SqStack &S) {S.base = new SElemType[MAXSIZE];if (!S.base)return 0;S.top = S.base;S.stacksize = MAXSIZE;return OK;
}
4、顺序栈的入栈
//进栈
Status Push(SqStack &S, SElemType e) {if (S.top - S.base == S.stacksize)return 0;*S.top++ = e;return OK;
}
5、顺序栈的出栈
//出栈
Status Pop(SqStack &S, SElemType &e) {if (S.top == S.base)return 0;e = *(--S.top);return OK;
}
6、取栈顶元素
//获取栈顶元素
Status Top(SqStack &S, SElemType &e) {if (S.top == S.base)return ERROR;e = *(S.top - 1);return OK;
}
7、栈的遍历输出
//栈的遍历输出
void printStack(SqStack S) {printf("现在栈内元素为:");SElemType *p = S.base;while (p != S.top) {printf("%c ", *p);p++;}printf("\n");
}
8、顺序栈的判空
//判空S.top == S.base
Status StackEmpty(SqStack S) {if (S.top == S.base) {return true;} else {return false;}
}
9、顺序栈的判满
//判满
Status FullEmpty(SqStack S) {if (S.top - S.base == S.stacksize) {return true;} else {return false;}
}
 10、求顺序栈长度
//求顺序栈长度
Status StackLength(SqStack S) {return S.top - S.base;
}
11、顺序栈的清空
//清空
Status ClearStack(SqStack &S) {S.top = S.base;return OK;
}
12、顺序栈的销毁

//销毁
Status DestroyStack(SqStack &S) {if (S.base) {delete S.base;S.stacksize = 0;S.top = S.base = NULL;}return OK;
}
13、数制转换
//数制转换
void conversion(int N) {SqStack S;InitStack(S);char e;while (N) {Push(S, N % 8);N = N / 8;}while (!StackEmpty(S)) {Pop(S, e);printf("%d", e);}
}
 14、括号匹配
//括号匹配
Status Matching() {SqStack S;InitStack(S);SElemType ch, x;Status flag = 1;printf("请输入需要匹配的括号(以#结束):\n");//char ch = getche();scanf("%c", &ch);while (ch != '#' && flag) {switch (ch) {case '(':case '[':Push(S, ch);break;case ')':if (!StackEmpty(S) && GetTop(S) == '(') {Pop(S, x);} else {flag = 0;}break;case ']':if (!StackEmpty(S) && GetTop(S) == '[') {Pop(S, x);} else {flag = 0;}break;}//ch = getche();scanf("%c", &ch);}if (StackEmpty(S) && flag) {return true;} else {return false;}
}

三、顺序栈的基本操作完整代码(C语言)

#include <stdio.h>
#include <conio.h>//getchae()#define OK 1
#define ERROR 0#define MAXSIZE 100typedef char SElemType;
typedef int Status;//创建结构体
typedef struct {SElemType *base;SElemType *top;int stacksize;
} SqStack;//初始化
Status InitStack(SqStack &S) {S.base = new SElemType[MAXSIZE];if (!S.base)return 0;S.top = S.base;S.stacksize = MAXSIZE;return OK;
}//进栈
Status Push(SqStack &S, SElemType e) {if (S.top - S.base == S.stacksize)return 0;*S.top++ = e;return OK;
}//求顺序栈长度
Status StackLength(SqStack S) {return S.top - S.base;
}//出栈
Status Pop(SqStack &S, SElemType &e) {if (S.top == S.base)return 0;e = *(--S.top);return OK;
}//获取栈顶元素
Status Top(SqStack &S, SElemType &e) {if (S.top == S.base)return ERROR;e = *(S.top - 1);return OK;
}//获取栈顶元素
SElemType GetTop(SqStack &S) {if (S.top == S.base)return ERROR;return *(S.top - 1);
}//栈的遍历输出
void printStack(SqStack S) {printf("现在栈内元素为:");SElemType *p = S.base;while (p != S.top) {printf("%c ", *p);p++;}printf("\n");
}//清空
Status ClearStack(SqStack &S) {S.top = S.base;return OK;
}//销毁
Status DestroyStack(SqStack &S) {if (S.base) {delete S.base;S.stacksize = 0;S.top = S.base = NULL;}return OK;
}
//Status DestoryStack(SqStack &S) {
//    if (S.base) {
//        delete S.base;
//        S.stacksize = 0;
//        S.base = S.top = NULL;
//    }
//    return OK;
//}//判空S.top == S.base
Status StackEmpty(SqStack S) {if (S.top == S.base) {return true;} else {return false;}
}//判满
Status FullEmpty(SqStack S) {if (S.top - S.base == S.stacksize) {return true;} else {return false;}
}//数制转换
void conversion(int N) {SqStack S;InitStack(S);char e;while (N) {Push(S, N % 8);N = N / 8;}while (!StackEmpty(S)) {Pop(S, e);printf("%d", e);}
}//括号匹配
Status Matching() {SqStack S;InitStack(S);SElemType ch, x;Status flag = 1;printf("请输入需要匹配的括号(以#结束):\n");//char ch = getche();scanf("%c", &ch);while (ch != '#' && flag) {switch (ch) {case '(':case '[':Push(S, ch);break;case ')':if (!StackEmpty(S) && GetTop(S) == '(') {Pop(S, x);} else {flag = 0;}break;case ']':if (!StackEmpty(S) && GetTop(S) == '[') {Pop(S, x);} else {flag = 0;}break;}//ch = getche();scanf("%c", &ch);}if (StackEmpty(S) && flag) {return true;} else {return false;}
}//功能菜单
Status choice() {printf("==================================\n");printf("         顺序栈操作功能菜单        \n");printf("1、进栈  2、出栈  3、获取栈顶元素   \n");printf("4、清空  5、销毁   6、批量进栈     \n");printf("7、打印栈内元素     8、数制转换    \n");printf("9、括号匹配  10、判空  11、判满    \n");printf("12、顺序栈的长度    13退出程序     \n");printf("==================================\n");return 0;
}int main() {SqStack Sqstack;//初始化Status rInitStack = InitStack(Sqstack);if (rInitStack == OK) {printf("顺序栈初始化成功!\n");} else {printf("顺序栈初始化失败!\n");}while (1) {//功能菜单choice();int flag;printf("请输入所需的功能编号:");scanf("%d", &flag);switch (flag) {case 1: {//进栈SElemType Pushdata;printf("请输入插入元素(请在英文状态下输入例如:a): \n");getchar();scanf("%c", &Pushdata);Status rPush = Push(Sqstack, Pushdata);if (rPush == OK) {printf("向顺序栈进栈%c成功!\n\n", Pushdata);} else {printf("向顺序栈进栈失败!\n\n");}}break;case 2: {//出栈SElemType popData;Status rPop = Pop(Sqstack, popData);if (rPop == OK) {printf("向顺序栈出栈%c成功!\n\n", popData);} else {printf("向顺序栈出栈失败!\n\n");}}break;case 3: {//获取栈顶元素SElemType topData;Status rTop = Top(Sqstack, topData);if (rTop == OK) {printf("向顺序栈获取栈顶元素:%c  。\n\n", topData);} else {printf("向顺序栈获取栈顶元素失败!\n\n");}//获取栈顶元素
//                Status rGetTop = GetTop(Sqstack);
//                if (rGetTop == OK) {
//                    printf("向顺序栈获取栈顶元素:%d\n", topData);
//                } else {
//                    printf("向顺序栈获取栈顶元素失败!\n");
//                }}break;case 4: { //清空Status rClearStack = ClearStack(Sqstack);if (rClearStack == OK) {printf("顺序栈清空成功!\n\n");} else {printf("顺序栈清空失败!\n\n");}}break;case 5: {//销毁Status rDestroyStack = DestroyStack(Sqstack);if (rDestroyStack == OK) {printf("顺序栈销毁成功!\n\n");} else {printf("顺序栈销毁失败!\n\n");}}break;case 6: {//批量插入int on;printf("请输入想要插入的元素个数:\n");scanf("%d", &on);SElemType array[on];for (int i = 1; i <= on; i++) {getchar();printf("向顺序栈第%d个位置插入元素为:", (i));scanf("%c", &array[i]);}for (int i = 1; i <= on; i++) {Status rPush = Push(Sqstack, array[i]);if (rPush == OK) {printf("向顺序栈第%d个位置插入元素%c成功!\n", i, array[i]);} else {printf("向顺序栈第%d个位置插入元素%c失败!\n", i, array[i]);}}}break;case 7: {//打印栈内元素printStack(Sqstack);}break;case 8: {//数制转换int N;printf("请输入1个非负十进制数:");scanf("%d", &N);printf("十进制数:%d 。\n", N);printf("转换为八进制数为:");conversion(N);printf("\n");}break;case 9: {//括号匹配Status rMatch = Matching();if (rMatch == true) {printf("括号匹配成功!\n\n");} else {printf("括号匹配不成功!\n\n");}}break;case 10: {//判空Status rStackEmpty = StackEmpty(Sqstack);if (rStackEmpty == true) {printf("顺序栈为空栈!\n\n");} elseprintf("顺序栈不为空!\n\n");}break;case 11: {//判满Status rFullEmpty = FullEmpty(Sqstack);if (rFullEmpty == true) {printf("顺序栈已满!\n\n");} elseprintf("顺序栈不为满!\n\n");}break;case 12: {//顺序栈的长度Status length = StackLength(Sqstack);printf("顺序栈的长度为:%d 。\n\n", length);}break;case 13: {//退出程序return 0;}break;default: {printf("输入错误,无此功能,请检查输入:\n\n");}}}return 1;
}

 四、运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法专题】动态规划之路径问题

动态规划2.0 动态规划 - - - 路径问题1. 不同路径2. 不同路径Ⅱ3. 珠宝的最高价值4. 下降路径最小和5. 最小路径和6. 地下城游戏 动态规划 - - - 路径问题 1. 不同路径 题目链接 -> Leetcode -62.不同路径 Leetcode -62.不同路径 题目&#xff1a;一个机器人位于一个 m …

(2)(2.4) CRSF/ELRS Telemetry

文章目录 前言 1 ArduPilot 参数编辑器 前言 &#xff01;Note ELRS&#xff08;ExpressLRS&#xff09;遥控系统使用穿越火线协议&#xff0c;连接方式类似。不过&#xff0c;它不像穿越火线那样提供双向遥测。 TBS CRSF 接收机与 ArduPilot 的接口中包含遥测和遥控信息。…

【大数据精讲】全量同步与CDC增量同步方案对比

目录 背景 名词解释 问题与挑战 FlinkCDC DataX 工作原理 调度流程 五、DataX 3.0六大核心优势 性能优化 背景 名词解释 CDC CDC又称变更数据捕获&#xff08;Change Data Capture&#xff09;&#xff0c;开启cdc的源表在插入INSERT、更新UPDATE和删除DELETE活动时…

c++ 包管理工具vcpkg

微软包管理工具 一、下载 git clone https://github.com/microsoft/vcpkg二、初始化 ./vcpkg/bootstrap-vcpkg.sh三、查看帮助文档 ./vcpkg/vcpkg help四、安装包 vcpkg/vcpkg install fmt五、查看安装包 vcpkg/vcpkg list输出 包实际安装路径 ./vcpkg/packages/fmt_x…

docker - compose 部署 Tomcat

目录 下面用 docker-compose 方法部署 Tomcat 1、准备工作 2、部署容器 启动容器 查看新启动的容器 3、总结 下面用 docker-compose 方法部署 Tomcat 1、准备工作 先在主机创建工作文件夹&#xff0c;为了放置 Tomcat 的配置文件等。创建文件夹的方法&#xff0c;自己搞…

JVM篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、解释 Java 堆空间及 GC?二、JVM 内存区域三、程序计数器(线程私有)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一…

「Qt Widget中文示例指南」如何实现一个日历?(三)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文中的CalendarWi…

API接口安全总结

接口分类 HTTP接口 RPC接口&#xff08;客户端和服务器端的连接 例如游戏登陆&#xff09;非web协议&#xff0c;PRC 远程过程调用 Remote Procedure Call&#xff0c;其就是一个节点请求另外一个节点提供的服务。当两个物理分离的子系统需要建立逻辑上的关联时&#xff0c;R…

Centos7 两种方式安装 MySQL5.7 步骤 yum 、本地 tar 文件

一、使用 yum 源方式安装 1、卸载系统自带 mariadb MariaDB Server 是最流行的开源 关系型数据库 之一。它由 MySQL 的原始开发者制作&#xff0c;并保证保持开源。 在 CentOS 7 中默认安装有 MariaDB 可忽略&#xff0c;安装完成之后可以直接覆盖掉 MariaDB。 查看并卸载系统…

扩散模型公式推导

这篇文章将尝试推导扩散模型 DDPM 中涉及公式&#xff0c;主要参考两个 B 站视频&#xff1a; 大白话AI狗中赤兔 本文所用 PPT 元素均来自 UP 主&#xff0c;狗中赤兔和大白兔AI&#xff0c;特此感谢。 在证明开始&#xff0c;我们需要先对扩散模型有一个整体的认知。扩散模型…

(M)unity2D敌人的创建、人物属性设置,遇敌掉血

敌人的创建 1.敌人添加与组件设置 1&#xff09;添加敌人后&#xff0c;刚体添加&#xff0c;碰撞体添加&#xff08;一个碰撞体使猪在地上走&#xff0c;不接触人&#xff0c;另一个碰撞体组件使人和猪碰在一起产生伤害&#xff09; ①刚体 ②碰撞体一 设置的只在脚下&a…

【寒假打卡】Day01

文章目录 选择编程HJ99 自守数OR86 返回小于 N 的质数个数 选择 如下代码输出的是什么&#xff08; &#xff09; char a101; int sum200; a27;suma; printf("%d\n",sum);A: 32 B: 99 C: 328 D: 72 答案&#xff1a; C 解析&#xff1a; 首先&#xff0c;char a …

VIM工程的编译 / VI的快捷键记录

文章目录 VIM工程的编译 / VI的快捷键记录概述笔记工程的编译工程的编译 - 命令行vim工程的编译 - GUI版vim备注VIM的帮助文件位置VIM官方教程vim 常用快捷键启动vi时, 指定要编辑哪个文件正常模式光标的移动退出不保存 退出保存只保存不退出另存到指定文件移动到行首移动到行尾…

Spring RabbitMQ那些事(3-消息可靠传输和订阅)

目录 一、序言二、生产者确保消息发送成功1、为什么需要Publisher Confirms2、哪些消息会被确认处理成功 三、消费者保证消息被处理四、Spring RabbitMQ支持代码示例1、 application.yml2、RabbigtMQ配置3、可靠生产者配置4、可靠消费者配置5、测试用例 一、序言 在有些业务场…

告别无法访问的Github

告别无法访问的Github 最近在使用github的时候又登不上去了&#xff0c;挂着VPN都没用 但是自己很多项目都存在github&#xff0c;登不上去那不得损失很大 所以一行必须整点儿特殊手段来访问&#xff0c;顺便分享一下 1.加速器 网上很多解决方案都是在分享各种加速器来登陆…

大型语言模型 (LLM)全解读

一、大型语言模型&#xff08;Large Language Model&#xff09;定义 大型语言模型 是一种深度学习算法&#xff0c;可以执行各种自然语言处理 (NLP) 任务。 大型语言模型底层使用多个转换器模型&#xff0c; 底层转换器是一组神经网络。 大型语言模型是使用海量数据集进行训练…

【Linux】Linux中的日志查询方法

文章目录 linux日志与日志的查询方法更多journalctl用法journalctl用法案例部分日志路径说明推荐阅读 linux日志与日志的查询方法 在Linux系统中&#xff0c;日志文件用于记录系统的各种运行信息和错误消息。常见的日志文件包括但不限于/var/log/下的各种日志&#xff0c;如me…

Armv8-M的TrustZone技术之SAU寄存器总结

每个SAU寄存器是32位宽。下表显示了SAU寄存器概要。 5.1 SAU_CTRL register SAU_CTRL寄存器的特征如下图和表所示&#xff1a; 5.2 SAU_TYPE register 5.3 SAU_RNR register 5.4 SAU_RBAR register 5.5 SAU_RLAR register 5.6 SAU区域配置 当SAU启用时&#xff0c;未由已启用…

亚信安慧AntDB:AntDB-M元数据锁之对象锁(四)

l 对象锁 (per-object locks) 除了IX锁&#xff0c;其他类型都可以用于其他命名空间&#xff0c;这部分是最常用的锁类型。主要用于对数据库的某个具体元数据的并发控制。这类锁对象会比较多&#xff0c;对其有独特的管理&#xff0c;本文不再展开说明。 5.3 两种锁类型 根据…

桌面型物联网智能机器人设计(预告)

相关资料 桌面级群控机器人CoCube探索-2022--CSDN博客 视频&#xff1a; 能&#xff01;有&#xff01;多&#xff01;酷&#xff01;CoCube桌面级群控机器人 让我看看谁在SJTU里划水… 简要介绍 设计一个桌面型物联网智能机器人&#xff0c;以ESP32芯片为核心&#xff0c;配…