数据结构 栈的操作实例详解
发布时间 - 2026-01-11 02:05:05 点击率:次数据结构 栈的操作实例详解

说明:
往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉。下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了。
一、实现
1.程序功能
关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换。
2.预定义、头文件导入和类型别名
代码如下:
#include<stdio.h> #include<stdlib.h> #define OVERFLOW -1 #define ERROR 0 #define FALSE 0 #define TRUE 1 #define OK 1 typedef int ElemType; typedef int Status;
除了两个头文件的导入是必须的之外,下面做两点说明:
(1)其余的常量定义都是可选的,为的就是在下面的代码书写过程中可以尽量使用英文来表达程序的意思,而不是在代码的实现过程中直接使用数字,依个人喜欢,也可以直接使用数字;
(2)使用typedef做类型的别名也仅仅是为了程序中代码的意思更加清晰明了而已,实际也可以不这样使用;
3.顺序栈的定义
代码如下:
typedef struct{
ElemType *elem; //存储空间的基址
int top; //栈顶元素的下一个元素,简称栈顶位标
int size; //当前分配的存储容量,作用看入栈操作就可以知道
int increment; //扩容时,增加的存储容量,作用看入栈操作就可以知道
} SqStack; //顺序栈名称
4.栈的初始化
代码如下:
Status InitStack_Sq(SqStack &S, int size, int inc){ //接受3个参数,&S是对结构体的引用
S.elem = (ElemType*)malloc(size*sizeof(ElemType)); //分配存储空间
if(S.elem == NULL) return OVERFLOW; //判断上一步分配存储空间是否成功
S.top = 0; //置S为空栈,S.top为0即表示栈为空栈
S.size = size; //栈的空间初始容量值
S.increment = inc; //栈的空间初始增量值(如果需要扩容)
return OK; //上面的执行正常,返回OK
}
5.空栈的判断
代码如下:
Status StackEmpty_Sq(SqStack S){
if(S.top == 0)
return TRUE;
else
return FALSE;
}
//空栈的决断是,如果栈为空就返回1,否则就返回0,当然可以不这样规定;
//至于为什么要做空栈的判断,自然是有原因的,下面再看程序的代码时就可以知道了。
6.入栈
代码如下:
Status Push_Sq(SqStack &S, ElemType e){ //将元素e压入栈,这里e只是一个形参而已
ElemType *newbase; //定义中间变量
if(S.top>= S.size){ //S.top如果指向最后一个不存储元素的地址时,即S.top大于
newbase = (ElemType*)realloc(S.elem, //等于S.size时,就表示栈满了
(S.size + S.increment)*sizeof(ElemType)); //通过realloc动态扩容
if(NULL == newbase) return OVERFLOW; //判断扩容是否成功
S.elem = newbase; //扩容成功后才将中间变量的值指向S.elem,防止扩容失败时,
S.size = S.size + S.increment; //S.elem指向一个不是原来的位置
}
S.elem[S.top] = e; //将e元素入栈
S.top++; //使S.top加1,表示指向的是栈顶位标
return OK; //上面操作正常后返回1
}
7.出栈
代码如下:
Status Pop_Sq(SqStack &S, ElemType &e){ //栈顶元素出栈,赋给元素e
if(0 == S.top) return ERROR;
e = S.elem[--S.top]; //e出栈,并将S.top减1
return OK;
}
8.进制转换的函数
其实上面的步骤操作都是为了创建一个顺序栈和定义顺序栈的操作而已,并对可能出现的各种情况做一些相应的举措,完毕后,下面就要使用上面创建的顺序栈以及栈的操作接口了,即在数制转换函数(这里是十进制转八进制)中使用上面的操作接口,代码如下:
void Converstion(int N){
SqStack S;
ElemType e;
InitStack_Sq(S, 10, 5); //栈S的初始容量置为10,每次扩容容量为5
while(N != 0){
Push_Sq(S, N%8); //将N除以8的余数入栈
N /= 8; //N取值为其除以8的商
} //理论基础为除8取余法
while(StackEmpty_Sq(S) == FALSE){
Pop_Sq(S, e); //依次输出栈中的余数,并赋给元素e
printf("%d", e); //打印元素
}
9.main函数
进制转换函数调用栈操作的接口函数,以实现在数制转换过程中栈的操作;main函数调用数制转换函数,以实现数制的转换,代码如下:
int main(void){
printf("Enter a number:");scanf("%d",&num);
Converstion(num);
printf("\n");
}
二、执行
有了上面的代码后,就可以在编译器中编译执行了,这里我是用c free 5来进行程序代码的编译:
(1)输入的数为1348时的结果:
(2)输入的数为2526时的结果:
三、完整的代码
下面把代码都放在一起:
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
#define ERROR 0
#define FALSE 0
#define TRUE 1
#define OK 1
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType *elem;
int top;
int size;
int increment;
} SqStack;
Status InitStack_Sq(SqStack &S, int size, int inc){
S.elem = (ElemType*)malloc(size*sizeof(ElemType));
if(S.elem == NULL) return OVERFLOW;
S.top = 0;
S.size = size;
S.increment = inc;
return OK;
}
Status StackEmpty_Sq(SqStack S){
if(S.top == 0)
return TRUE;
else
return FALSE;
}
Status Push_Sq(SqStack &S, ElemType e){
ElemType *newbase;
if(S.top>= S.size){
newbase = (ElemType*)realloc(S.elem,
(S.size + S.increment)*sizeof(ElemType));
if(NULL == newbase) return OVERFLOW;
S.elem = newbase;
S.size = S.size + S.increment;
}
S.elem[S.top] = e;
S.top++;
return OK;
}
Status Pop_Sq(SqStack &S, ElemType &e){
if(0 == S.top) return ERROR;
e = S.elem[--S.top];
return OK;
}
void Converstion(int N){
SqStack S;
ElemType e;
InitStack_Sq(S, 10, 5);
while(N != 0){
Push_Sq(S, N%8);
N /= 8;
}
while(StackEmpty_Sq(S) == FALSE){
Pop_Sq(S, e);
printf("%d", e);
}
}
int main(void){
int num;
printf("Enter a number:");scanf("%d",&num);
Converstion(num);
printf("\n");
}
# 数据结构
# 栈
# 栈的实例
# 栈的基本操作
# java 数据结构中栈结构应用的两个实例
# C语言数据结构 栈的基础操作
# JavaScript数据结构学习之数组、栈与队列
# Java数据结构与算法之栈(动力节点Java学院整理)
# C++ 数据结构实现两个栈实现一个队列
# C语言 数据结构中栈的实现代码
# 栈和队列数据结构的基本概念及其相关的Python实现
# 都是
# 就可以
# 为空
# 过程中
# 数为
# 的是
# 头文件
# 我是
# 存储容量
# 是在
# 放在
# 是有
# 要把
# 听了
# 而不
# 要做
# 英文
# 并将
# 可以直接
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
如何在腾讯云服务器快速搭建个人网站?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
详解Oracle修改字段类型方法总结
原生JS获取元素集合的子元素宽度实例
Laravel如何使用Sanctum进行API认证?(SPA实战)
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
如何用西部建站助手快速创建专业网站?
如何在Windows服务器上快速搭建网站?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
使用Dockerfile构建java web环境
如何快速使用云服务器搭建个人网站?
实例解析angularjs的filter过滤器
Laravel如何保护应用免受CSRF攻击?(原理和示例)
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
Python图片处理进阶教程_Pillow滤镜与图像增强
黑客如何利用漏洞与弱口令入侵网站服务器?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
JavaScript中的标签模板是什么_它如何扩展字符串功能
javascript基本数据类型及类型检测常用方法小结
网站制作软件免费下载安装,有哪些免费下载的软件网站?
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
微信小程序 require机制详解及实例代码
深圳网站制作的公司有哪些,dido官方网站?
如何在IIS中新建站点并配置端口与IP地址?
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
JS弹性运动实现方法分析
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Laravel如何实现多对多模型关联?(Eloquent教程)
Laravel怎么连接多个数据库_Laravel多数据库连接配置
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
PHP 500报错的快速解决方法
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
JavaScript如何实现类型判断_typeof和instanceof有什么区别
如何快速登录WAP自助建站平台?
深入理解Android中的xmlns:tools属性
Android自定义控件实现温度旋转按钮效果
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
如何为不同团队 ID 动态生成多个独立按钮
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
Linux安全能力提升路径_长期防护思维说明【指导】

