4、数据结构与算法解析(C语言版)--栈

栈的数据存储遵循“后进先出的规则”,这在计算机里面是非常有用的,比如word等编辑软件的"撤销"功能,就是使用栈进行实现的。

1、创建项目

 main.h

#ifndef _MAIN_H
#define _MAIN_H

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define INFEASIBLE -1   // 无意义 
#define OVERFLOW -2

typedef int Status;
typedef int ElemType;
typedef int SElemType;


#endif 

main.c

#include "Stack.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	Stack_test();	
	
	return 0;
}

Stack.h

#ifndef _STACK_H
#define _STACK_H

#include "main.h"

void Stack_test(void);

#endif

Stack.c

#include "Stack.h"

void Stack_test(void)
{
	
}

2、创建栈结构

#ifndef _STACK_H
#define _STACK_H

#include "main.h"

#define STACK_INT_SIZE 10  // 栈初始容量为10 
#define STACK_INCREMENT 2  // 空间不够每次增加两个 

// 栈结构类型
typedef struct 
{
	SElemType *base;   // 栈底指针,栈构造和销毁后为NULL
	SElemType *top;   // 栈顶指针
	int stacksize;    // 当前栈的容量,分配的空间数		
}SqStack;

void Stack_test(void);

#endif

3、初始化栈

// 初始化栈 
// - 在函数内部修改外部栈空间的base、top、stacksize因此需要传入外部栈空间地址
void InitStack(SqStack *s) 
{
	s->base = (SElemType *)malloc(STACK_INT_SIZE *sizeof(SElemType));
	if(!s->base)
	{
		printf("申请栈空间失败\r\n");
		exit(OVERFLOW);
	}
	
	s->top = s->base;
	s->stacksize = 0;
} 

测试代码:

void Stack_test(void)
{
	SqStack st;
	InitStack(&st);
}

4、向栈中添加元素

// 向栈中添加元素
// - 在函数内部修改外部栈空间的base、top、stacksize因此需要传入外部栈空间地址
void Push(SqStack *s,SElemType e) 
{
	if(s->top - s->base == s->stacksize )
	{
		// 栈满
		SElemType *temp;
		temp =  (SElemType *)realloc(s->base,(s->stacksize + STACK_INCREMENT)*sizeof(SElemType));
		if(!temp)
		{
			printf("申请栈空间失败\r\n");
			exit(OVERFLOW);
		}
		
		s->base = temp; // 申请成功,修改s->base指向
		s->top = s->base + s->stacksize;  // 更改新的top指针指向
		s->stacksize +=  STACK_INCREMENT;		
	}
	
	// 将元素推入栈中 
	*(s->top) = e;
	// 栈顶指针移动 
	(s->top)++; 
}

5、访问栈数据

// 访问栈数据
void StackTraverse(SqStack s)
{
	SElemType *p = s.base;
	
	while(p < s.top)
	{
		printf("%d ",*p);
		p++;
	}
	printf("\n");
} 

测试代码:

void Stack_test(void)
{
	SqStack st;
	InitStack(&st);
	
	int i = 0;
	for(i=1;i<8;i++)
	{
		Push(&st,i);
	}
	
	StackTraverse(st);
}

 6、获取栈顶元素不移除

Status GetTop(SqStack s,SElemType *e)
{
	if(s.top > s.base)
	{
		// 栈不为空
		*e = *(s.top-1); 
		return OK;
	}
	
	return ERROR;
}

测试代码: 

void Stack_test(void)
{
	SqStack st;
	InitStack(&st);
	
	int i = 0;
	for(i=1;i<8;i++)
	{
		Push(&st,i);
	}
	
	printf("栈中元素有:"); 
	StackTraverse(st);
	
	SElemType res;
	GetTop(st,&res);
	printf("栈顶元素:%d\n",res);	
	
}

7、移除栈顶元素

// 移除栈顶元素
// 接收栈顶数据到外部空间中
Status Pop(SqStack s,SElemType *e) 
{
	if(s.top == s.base) 
	{
		return ERROR;
	}
	
	--(s.top);
	*e = *(s.top);
	return OK;
}

测试代码:

void Stack_test(void)
{
	SqStack st;
	InitStack(&st);
	
	int i = 0;
	for(i=1;i<8;i++)
	{
		Push(&st,i);
	}
	
	printf("栈中元素有:"); 
	StackTraverse(st);
	
	SElemType res;
	Pop(st,&res);
	printf("移除的栈顶元素:%d\n",res);	
	
}

8、获取栈的数据长度

// 获取栈的数据长度
int StackLength(SqStack s) 
{
	return s.top - s.base;
}

测试代码:

void Stack_test(void)
{
	SqStack st;
	InitStack(&st);
	
	int i = 0;
	for(i=1;i<8;i++)
	{
		Push(&st,i);
	}
	
	printf("栈中元素有:"); 
	StackTraverse(st);
	
	int res = StackLength(st);
	printf("当前栈的长度是:%d\n",res);
	
}

9、空栈判断

// 空栈判断
Status StackEmpty(SqStack s)
{
	if(s.top == s.base)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
} 

测试代码:

void Stack_test(void)
{
	SqStack st;
	InitStack(&st);
	
	int i = 0;
	for(i=1;i<8;i++)
	{
		Push(&st,i);
	}
	
	printf("栈中元素有:"); 
	StackTraverse(st);
	
	int res = StackLength(st);
	printf("当前栈的长度是:%d\n",res);
	
	Status res1 = StackEmpty(st);
	if(res1)
	{
		printf("栈为空\n");
	}
	else
	{
		printf("栈不为空\n");
	}
	
}

10、将栈设置为空

// 将栈设置为空
void ClearStack(SqStack *s) 
{
	s->top = s->base;
}

测试代码:

void Stack_test(void)
{
	SqStack st;
	InitStack(&st);
	
	int i = 0;
	for(i=1;i<8;i++)
	{
		Push(&st,i);
	}
	
	printf("栈中元素有:"); 
	StackTraverse(st);
	
	printf("清空栈中数据开始 ---- \n");
	ClearStack(&st);
	printf("清空栈中数据结束 ---- \n");
	
	int len = StackLength(st);
	printf("清空后栈的长度是:%d\n",len); 
	
}

11、销毁栈空间

// 销毁栈空间
void DestoryStack(SqStack *s) 
{
	free(s->base);
	s->top = NULL;
	s->base = NULL;
	s->stacksize = 0;
}

测试代码:

void Stack_test(void)
{
	SqStack st;
	InitStack(&st);
	
	int i = 0;
	for(i=1;i<8;i++)
	{
		Push(&st,i);
	}
	
	printf("栈中元素有:"); 
	StackTraverse(st);
	
	printf("销毁栈空间开始 ---- \n");
	DestoryStack(&st);
	printf("销毁栈空间结束 ---- \n");
	
	int len = StackLength(st);
	printf("清空后栈的长度是:%d\n",len); 
	
}

注意写的所有函数记得在Stack.h中进行声明。

#ifndef _STACK_H
#define _STACK_H

#include "main.h"

#define STACK_INT_SIZE 10  // 栈初始容量为10 
#define STACK_INCREMENT 2  // 空间不够每次增加两个 

// 栈结构类型
typedef struct 
{
	SElemType *base;   // 栈底指针,栈构造和销毁后为NULL
	SElemType *top;   // 栈顶指针
	int stacksize;    // 当前栈的容量,分配的空间数		
}SqStack;

void Stack_test(void);
void InitStack(SqStack *sp) ;
void Push(SqStack *sp,SElemType e);
void StackTraverse(SqStack s);
Status Pop(SqStack s,SElemType *e) ;
int StackLength(SqStack s) ;
Status StackEmpty(SqStack s);
void ClearStack(SqStack *s) ;
void DestoryStack(SqStack *s); 

#endif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

施耐德变频器ATV320系列技术优势:创新与安全并重

在工业自动化领域&#xff0c;追求高效、安全与智能已成为不可阻挡的趋势。施耐德变频器ATV320系列凭借其强大的设计标准和全球认证&#xff0c;成为能够帮助企业降低安装成本&#xff0c;提高设备性能的创新解决方案。 【全球认证&#xff0c;品质保障】ATV320 系列秉持施耐德…

【软考高级】系统架构设计师复习笔记-精华版

文章目录 前言0 系统架构设计师0.1 考架构还是考系分0.2 架构核心知识0.3 架构教材变化 1 计算机操作系统1.1 cpu 组成1.2 内核的五大功能1.3 流水线技术1.4 段页式存储1.5 I/O 软件1.6 文件管理1.7 系统工程相关 2 嵌入式2.1 嵌入式技术2.2 板级支持包&#xff08;BSP&#xf…

并发编程(19)——引用计数型无锁栈

文章目录 十九、day191. 引用计数2. 代码实现2.1 单引用计数器无锁栈2.2 双引用计数器无锁栈 3. 本节的一些理解 十九、day19 上一节我们学习通过侯删链表以及风险指针与侯删链表的组合两种方式实现了并发无锁栈&#xff0c;但是这两种方式有以下缺点&#xff1a; 第一种方式…

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发&#xff08;2&#xff09;—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序&#xff0c;用于从大恒相机采集图像&#xff0c;通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码&#xff1a; # version:…

步进电机直线插补

基础原理 代码部分

数据结构经典算法总复习(上卷)

第一章&#xff1a;数据结构导论 无重要考点&#xff0c;仅需了解时间复杂度。 第二章&#xff1a;线性表 1.获得线性表第i个元素 void GetElem_sq(SqList L, int i, ElemType &e) {if (i<1 || i>L.length) ErrorMsg("Invalid i value"); //注意错误监…

Windows11 安装 Ubuntu-20.04,同时安装配置 zsh shell,配置 git 别名(alias),大大提高开发效率

背景&#xff1a;家里配置了一台 Windows 电脑&#xff0c;有时候需要用到 vscode 开发测试一些代码&#xff0c;在使用过程中发现原生 windows 敲代码不是很友好&#xff0c;于是想到配置 wsl&#xff0c;安装 Ubuntu&#xff0c;并安装配置 zsh shell&#xff0c;同时配置 gi…

PE文件结构

PE文件是Windows系统下可执行文件的总称&#xff0c;英文全称 Portable Executable 可移植的可执行文件&#xff0c;常见的有exe、dll、sys、com、ocx 对于学习反&#xff08;木马、免杀、病毒、外挂、内核&#xff09;&#xff0c;了解PE文件结构是非常有必要且非常非常重要的…

Helm 官方脚本

Helm 官方脚本 #!/usr/bin/env bash# Copyright The Helm Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # …

JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

本文为Oracle数据库JSON学习系列的第一篇&#xff0c;讲述如何将JSON文档存储到数据库中&#xff0c;包括了版本为19c和23ai的情形。 19c中的JSON 先来看一下数据库版本为19c时的情形。 创建表colortab&#xff0c;其中color列的长度设为4000。若color的长度需要设为32767&a…

C语言-结构体内存大小

#include <stdio.h> #include <string.h> struct S1 { char a;//1 int b;//4 char c;//1 }; //分析 默认对齐数 成员对齐数 对齐数(前两个最小值) 最大对齐数 // 8 1 …

PyTorch 神经网络回归(Regression)任务:关系拟合与优化过程

PyTorch 神经网络回归&#xff08;Regression&#xff09;任务&#xff1a;关系拟合与优化过程 本教程介绍了如何使用 PyTorch 构建一个简单的神经网络来实现关系拟合&#xff0c;具体演示了从数据准备到模型训练和可视化的完整过程。首先&#xff0c;利用一维线性空间生成带噪…

渐开线齿轮和摆线齿轮有什么区别?

摆线齿形与渐开线齿形的区别 虽然在比对这两种齿形&#xff0c;但有一个事情希望大家注意&#xff1a;渐开线齿轮只是摆线齿轮的一个特例。 &#xff08;1&#xff09;摆线齿形的压力角在啮合开始时最大&#xff0c;在齿节点减小到零&#xff0c;在啮合结束时再次增大到最大…

Debian 12 安装配置 fail2ban 保护 SSH 访问

背景介绍 双十一的时候薅羊毛租了台腾讯云的虚机, 是真便宜, 只是没想到才跑了一个月, 系统里面就收集到了巨多的 SSH 恶意登录失败记录. 只能说, 互联网真的是太不安全了. 之前有用过 fail2ban 在 CentOS 7 上面做过防护, 不过那已经是好久好久之前的故事了, 好多方法已经不…

Vulhub靶场Apache解析漏洞

一.apache_parsing 原理&#xff1a;Apache HTTPD ⽀持⼀个⽂件拥有多个后缀&#xff0c;并为不同后缀执⾏不同的指令。在Apache1.x/2.x中Apache 解析⽂件的规则是从右到左开始判断解析,如果后缀名为不可识别⽂件解析,就再往左判断。如 1.php.xxxxx 打开靶场 创建一个名为1.p…

MATLAB 抛物线拟合(Quadratic,二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里仍然是最小二乘法的应用,其推导过程如下所述: 1.二次函数模型: 其中,a、b 和 c 是需要确定的参数。 2.最小二乘法 假设我们有一组数据点 ( x 1 ​ , y 1

重温设计模式--原型模式

文章目录 原型模式定义原型模式UML图优点缺点使用场景C 代码示例深拷贝、浅拷贝 原型模式定义 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象&#xff1b; 核心中的核心就是 克隆clone ,后面讲 原型模式是一种创建型设计模式&#xff0c;它的主要…

mac iterm2 使用 lrzsz

前言 mac os 终端不支持使用 rz sz 上传下载文件&#xff0c;本文提供解决方法。 mac 上安装 brew install lrzsz两个脚本 注意&#xff1a;/usr/local/bin/iterm2-send-zmodem.sh 中的 sz命令路径要和你mac 上 sz 命令路径一致。 /usr/local/bin/iterm2-recv-zmodem.sh 中…

【基础篇】1. JasperSoft Studio编辑器与报表属性介绍

编辑器介绍 Jaspersoft Studio有一个多选项卡编辑器&#xff0c;其中包括三个标签&#xff1a;设计&#xff0c;源代码和预览。 Design&#xff1a;报表设计页面&#xff0c;可以图形化拖拉组件设计报表&#xff0c;打开报表文件的主页面Source&#xff1a;源代码页码&#xff…

【magic-dash】01:magic-dash创建单页面应用及二次开发

文章目录 一、magic-dash是什么1.1 安装1.2 使用1.2.1 查看内置项目模板1.2.2 生成指定项目模板1.2.3 查看当前magic-dash版本1.2.4 查看命令说明1.2.5 内置模板列表二、创建虚拟环境并安装magic-dash三、magic-dash单页工具应用开发3.1 创建单页面项目3.1.1 使用命令行创建单页…