数据结构与算法--用c语言建立栈以及其相关操作

2023-11-01

一.栈的定义和特点

栈(stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头端称为栈底(bottom)。不含元素的栈称为空栈。

假设栈S=(a1,a2,...an),则称a1为栈底元素,an为栈顶元素。栈中元素按a1,a2,...an的顺序进栈,退栈的第一个元素为栈顶元素,如下图所示。因此栈又被称为后进先出的线性表。

二.栈的相关操作及其代码

栈主要分为顺序栈和链栈,这里我将以建立顺序栈作为示例。

1.顺序栈的建立(初始化)

顺序栈的建立推荐首先构造一个结构体来存放栈的相关要素(栈顶指针,栈底指针,栈的最大容量等),然后为栈申请一个空间,使栈顶指针等于栈底指针,并设置栈的最大容量。

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

#define MAXSIZE 100

typedef int ElemType;

typedef struct {
	ElemType *top;
	ElemType *base;
	int stacksize;
}stack;

stack *create_stack(stack *s)
{
	s = (stack *)malloc(sizeof(stack)); 
	s->base = (ElemType *)malloc(sizeof(ElemType[MAXSIZE]));
	s->stacksize = MAXSIZE;
	s->base = s->top;
	printf("创建成功!\n");
	return s;
}

2.顺序栈的入栈操作

入栈前需检查栈是否已满,如未满则将新元素压入栈,栈顶指针加一。

void push_stack(stack *s,ElemType x)
{
	if(s->top - s->base > s->stacksize)
	{
		printf("栈已满!\n");
		return;
	}
	*(s->top) = x;
	(s->top)++;
	printf("入栈成功!\n");
}

3.顺序栈的出栈操作

出栈前需检查栈是否为空,如不为空则栈顶指针减一,栈顶元素出栈。

void pop_stack(stack *s)
{
	if(s->top == s->base)
	{
		printf("此栈为空!\n");
		return;
	}
	s->top--;
	printf("出栈成功!\n");
}

4.顺序栈的取值操作

当栈为非空时,返回当前栈顶元素的值,栈顶指针不变。

ElemType get_stack(stack *s)
{
	if(s->top == s->base)
	{
		printf("此栈为空!\n");
		return 0;
	}
	return *(s->top-1);
}

完整代码

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

#define MAXSIZE 100

typedef int ElemType;

typedef struct {
	ElemType *top;
	ElemType *base;
	int stacksize;
}stack;

stack *create_stack(stack *s)
{
	s = (stack *)malloc(sizeof(stack)); 
	s->base = (ElemType *)malloc(sizeof(ElemType[MAXSIZE]));
	s->stacksize = MAXSIZE;
	s->base = s->top;
	printf("创建成功!\n");
	return s;
}

void push_stack(stack *s,ElemType x)
{
	if(s->top - s->base > s->stacksize)
	{
		printf("栈已满!\n");
		return;
	}
	*(s->top) = x;
	(s->top)++;
	printf("入栈成功!\n");
}

void pop_stack(stack *s)
{
	if(s->top == s->base)
	{
		printf("此栈为空!\n");
		return;
	}
	s->top--;
	printf("出栈成功!\n");
}

ElemType get_stack(stack *s)
{
	if(s->top == s->base)
	{
		printf("此栈为空!\n");
		return 0;
	}
	return *(s->top-1);
}

int main()
{
	int a = 0;
	int x,y;
	stack *s;
	printf("1.建立\n2.入栈\n3.出栈\n4.取值\n5.退出\n");
	while(a != 5)
	{
		printf("请输入:\n");
		scanf("%d",&a);
		getchar();
		switch(a)
		{
			case 1:{
				s = create_stack(s);
				break;
			}
			case 2:{
				printf("输入欲入栈的元素:\n");
				scanf("%d",&x);
				push_stack(s,x);
				break;
			}
			case 3:{
				pop_stack(s);
				break;
			}
			case 4:{
				y = get_stack(s);
				printf("栈顶元素为%d\n",y);
				break;
			}
		}
	}
	free(s);
}

三.总结

栈其实是一种特殊的线性表,在某些时候的合理应用可以使问题变得简单化,比如进制转换等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法--用c语言建立栈以及其相关操作 的相关文章

  • Win7 IIS7解析漏洞复现

    一 漏洞说明 文件上传使用白名单做限制 只能上传图片文件 导致脚本文件无法上传 上传图片马绕过白名单文件上传的验证 但是图片马又无法解析 利用IIS7 5文件解析漏洞的特点 任意文件名 任意文件名 php 从而解析脚本文件 二 搭建环境 1
  • DA14585调试记录--获取蓝牙的MAC地址

    最近在调试DA14585的蓝牙芯片 中间遇到了一些坑 于是就随手将调试的过程记录下来 方便以后自己查看 芯片平台 DA14585 SDK 6 0 12 1020 2 编译工具 Keil5 这次的需求是获取蓝牙的MAC地址 第一反应是去SDK

随机推荐

  • 如何用python爬取公众号文章_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号 有时遇到一个感兴趣的公众号时 都会感觉相逢恨晚 想一口气看完所有历史文章 但是微信的阅读体验挺不好的 看历史文章得一页页的往后翻 下一次再看时还得重复操作 很是麻烦 于是便想着能不能把某个公众号所有的文章都保存下来 这样
  • 提升SQLite数据插入效率低、速度慢的方法

    http blog csdn net majiakun1 article details 46607163
  • 关于veriloga和Verilogasm透射思考

    Verilogasm是一个如何诞生的语言系统呢 我认为是用来表达 功能器件的信号处理 的语言系统 有信号处理 那么必然就存在两个问题 1 测试的数据是什么样的 2 观察的器件的功能是如何的 用一个模型表征它结构 如下 首先从功能的角度来分类
  • 使用vscode写vue文件代码有时不提示

    背景 安装了volar插件 但是在vue文件中导入js文件代码不提示 准确来说是有时提示有时不提示 解决方案 插件冲突 卸载 JavaScript ES6 code snippets 插件 这个插件在vue文件中适配不是很好 很有可能是插件
  • 详细解读一下chatGPT模型提取信息和生成回答的过程

    当ChatGPT接收到一个问题时 它首先使用内部的算法将问题转换为机器可理解的格式 例如将问题转换为词向量 然后将其输入到预训练模型中 预训练模型是通过在大规模语料库上训练的神经网络模型 它可以将输入的文本序列转换为一个输出的文本序列 在这
  • vue element el-date-picker日期选择器选择时间区间

    1 在项目中使用到了element日期选择组件 选择日期区间最大为6个月之前是让不在这区间给限制不让选择 html部分
  • JAVA8 List的去重、过滤、映射(map)、分组、统计(sum、max、min、avg)、分页

    目录 1 实现List对象集合的简单去重 distinct 2 实现List集合的根据属性 name 去重 3 实现List对象集合的简单过滤 过滤为 null 的对象 4 实现List对象集合中获取其中某一属性 weight 的List集
  • 二、Shell解析器

    1 Shell解析器有哪些 在linux服务器上面执行如下命令 sudo cat etc shells 可以看到有6种解析器 2 linux默认使用的解析器是哪种呢 使用命令 echo SHELL命令 可以查看到 默认使用的是bash解析器
  • centos 网卡显示Error, some other host already uses address

    1 nmcli已经关闭 2 重启网卡报错 mac地址被占用 最后的解决办法 原因 地址冲突 1 永久解决 换IP地址 2 临时解决 以下方案 vi etc sysconfig network scripts ifup eth 注释下面那五行
  • 软件架构模式+系统架构+架构作图

    架构模式对比 分层模式 一般信息系统中最常见的4层划分如下 Presentation layer 表示层 也就是UI层 Application layer 应用层 也就是服务层 Business logic layer 业务逻辑层 也就是领
  • C语言关于动态内存管理(malloc、calloc、realloc、free)

    动态内存 前言 若是没有动态容量 在创建变量时 只能预先设计好容量 而这样的容量可能会出现过多的浪费或者是容量不足 不能灵活的增加或减少容量 运用好关于动态内存管理的函数 就可以解决这些问题 让我们来了解这些函数吧 一 malloc voi
  • LightGroupButton* sender = static_cast<LightGroupButton*>(QObject::sender());

    当某一个Object emit一个signal的时候 它就是一个sender 系统会记录下当前是谁emit出这个signal的 因此我们可以从对应的槽函数里面获得哪个发送的信号 有可能多个Object的signal会连接到同一个signal
  • 再见2015,一个小白领的格调

    当我一直沉默着做事情的时候 时间就像一条脱缰的野狗一样 肆意狂奔 快到让我忘记了买回老家过冬的衣服便放春节了 以至于现在我还满脑子的考虑穿什么过冬 而不是感叹15年已经过完 2015年1月1日 六个小伙伴在吃烤肉 依次诉说各自的新年计划 我
  • 逆矩阵(inverse matrix)的概念及其意义

    逆矩阵 inverse matrix 的概念及其意义 2015年09月17日 00 09 10 阅读数 21838 标签 逆矩阵为何需要逆矩阵逆矩阵应用逆矩阵实例逆矩阵与倒数 更多 版权声明 本文为博主原创文章 未经博主允许不得转载 htt
  • windows 远程连接debian_有没有xrdp大神,用windows远程debian一片空白。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 补充俩文件吧 分别是以root登录和以另一个非root账号登录的日志 root登录的 20170510 22 30 04 INFO A connection received from ffff
  • 利用el-upload组件在vue中上传文件

    以上传图片为例 action 使用的接口地址 on change 改变时调用的方法 file list 文件列表 limit 限制上传文件的数量 on success 成功后调用的方法 on exceed 文件超出个数限制时调用的方法 更多
  • 为什么你的LDO输出不稳定?

    原文来自微信公众号 工程师看海 前一阵朋友和我说当初用某型号LDO时 发现输出异常 仔细阅读datasheet后 更换输出电容解决 LDO的输出电容对性能至关重要 除了会提高电源抑制比PSRR抑制噪声外 对环路稳定性也至关重要 电容除了容值
  • 耗时操作ANR和handler

    耗时操作 1 什么是ANR 在应用程序的主线程中执行一段耗时的代码 就有可能出现ANR异常 耗时的代码未执行结束时 界面会卡住 用户对界面进行了操作 10秒之后耗时代码如果还未结束 就会出现ANR异常 2 怎么避免ANR 主线程中不要执行耗
  • spark报错:WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI...

    1 报错描述 在使用spark跑任务时 进度条突然停止 并且warning了 而且持续 WARN TaskSchedulerImpl Initial job has not accepted any resources check your
  • 数据结构与算法--用c语言建立栈以及其相关操作

    一 栈的定义和特点 栈 stack 是限定仅在表尾进行插入或删除操作的线性表 因此 对栈来说 表尾端有其特殊含义 称为栈顶 top 相应地 表头端称为栈底 bottom 不含元素的栈称为空栈 假设栈S a1 a2 an 则称a1为栈底元素