栈——数据结构——day4

栈的定义

栈是限定仅在一段进行插入和删除操作的线性表。
我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。

栈的插入操作,叫作进栈,也称压栈、入栈。类似子弹入弹夹。
栈的删除操作,叫作出栈,也有的叫作弹栈。如同弹夹中的子弹出夹。

在这里插入图片描述

栈的抽象数据类型

头文件

#ifndef __STACK_H__
#define __STACK_H__#include<stdio.h>
#include<stdlib.h>typedef struct node
{int data;struct node *pnext;
}STACK_NODE;	typedef struct list
{STACK_NODE *phead;int clen;
}STACK_LIST;extern STACK_LIST *CreatStackList();
extern int PushHeadSTACK(STACK_LIST *plist,int data);
extern int PopHeadSTACK(STACK_LIST *plist,int *data);
extern STACK_NODE *GetTopOfStack(STACK_LIST *plist);
extern int ClearStack(STACK_LIST *plist);
extern void DestoryStack(STACK_LIST *plist);
extern int ErgodicOfStack(STACK_LIST *plist);
extern int StackLength(STACK_LIST *plist);#endif

栈的初始化

初始化操作,建立一个空栈

STACK_LIST *CreatStackList()
{STACK_LIST *p = malloc(sizeof(STACK_LIST));p->phead = NULL;p->clen = 0;return p;
}

销毁

若栈存在,则销毁

void DestoryStack(STACK_LIST *plist)
{ClearStack(plist);free(plist);return ;
}

清空

将栈清空

int ClearStack(STACK_LIST *plist)
{if(IsEmptyStack(plist)){return 0;}STACK_NODE *p = plist->phead;while(p){PopHeadSTACK(plist,NULL);p = plist->phead;}return 0;
}

判断栈是否为空

int IsEmptyStack(STACK_LIST *plist)
{return NULL == plist->phead;
}

进栈

若栈存在,插入新元素data到栈并成为栈顶元素
在这里插入图片描述

int PushHeadSTACK(STACK_LIST *plist,int data)
{STACK_NODE *p = malloc(sizeof(STACK_NODE));p->pnext = plist->phead;p->data = data;plist->phead = p;plist->clen++;return 0;
}

出栈

删除栈顶元素,并用data返回其值
在这里插入图片描述

int PopHeadSTACK(STACK_LIST *plist,int *data)
{if(IsEmptyStack(plist)){return -1;}STACK_NODE *p = plist->phead;plist->phead = p->pnext;if(data != NULL){*data = p->data;}free(p);plist->clen--;return 0;
}

获取栈顶元素

若栈存在且为空,返回栈顶并获取其指针

STACK_NODE *GetTopOfStack(STACK_LIST *plist)
{if(IsEmptyStack(plist)){return NULL;}STACK_NODE *p = plist->phead;return p;
}

栈的长度

返回栈的元素个数

int StackLength(STACK_LIST *plist)
{return plist->clen;
}

遍历栈

int ErgodicOfStack(STACK_LIST *plist)
{if(IsEmptyStack(plist)){return 0;}STACK_NODE *p = plist->phead;while(p){printf("%d ",p->data);p = p->pnext;}putchar('\n');return 0;
}

栈的应用

四则运算表达式求值

头文件

#ifndef __STACK_H__
#define __STACK_H__#include<stdio.h>
#include<stdlib.h>
#include<string.h>typedef struct node
{int data;struct node *pnext;
}STACK_NODE;typedef struct list
{STACK_NODE *phead;int clen;
}STACK_LIST;extern STACK_LIST *CreatStackList();
extern int PushHeadSTACK(STACK_LIST *plist,int data);
extern int PopHeadSTACK(STACK_LIST *plist,int *data);
extern int GetTopOfStack(STACK_LIST *plist,int *num);
extern int ClearStack(STACK_LIST *plist);
extern void DestoryStack(STACK_LIST *plist);
extern int ErgodicOfStack(STACK_LIST *plist);
extern int StackLength(STACK_LIST *plist);
extern int IsEmptyStack(STACK_LIST *plist);#endif

main.c

#include "stack.h"int IsNumChar(char ch)
{if(ch >= '0' && ch <= '9'){return 1;}return 0;
}int GetOptLevel(char opt)
{switch(opt){case '+':case '-':return 1;case '*':case '/':return 2;default:printf("opt error\n");exit(1);}
}int GetValue(int num1,int num2,int opt)
{switch(opt){case '+':return num1 + num2;case '-':return num1 - num2;case '*':return num1 * num2;case '/':return num1 / num2;}
}int main(void)
{char str[1024] = {0};STACK_LIST *pstacknum = CreatStackList();STACK_LIST *pstackopt = CreatStackList();if(NULL == pstacknum || NULL == pstackopt){return -1;}printf("Please enter four operations:");fgets(str,sizeof(str),stdin);str[strlen(str)-1] = '\0';char *p = str;int num = 0;int popOpt;int num1,num2,opt;while(1){if(*p == '\0' && IsEmptyStack(pstackopt)){break;}while(IsNumChar(*p)){num = num * 10 + (*p - '0') ;p++;if(!IsNumChar(*p)){PushHeadSTACK(pstacknum,num);num = 0;}}if(IsEmptyStack(pstackopt)){PushHeadSTACK(pstackopt,*p);p++;continue;}GetTopOfStack(pstackopt,&popOpt);if(*p != '\0' && GetOptLevel(*p) > GetOptLevel(popOpt)){PushHeadSTACK(pstackopt,*p);p++;}else{PopHeadSTACK(pstackopt,&opt);PopHeadSTACK(pstacknum,&num2);PopHeadSTACK(pstacknum,&num1);int res = GetValue(num1,num2,opt);PushHeadSTACK(pstacknum,res);}}ErgodicOfStack(pstacknum);DestoryStack(pstacknum);DestoryStack(pstackopt);return 0;
}

opera.c

#include "stack.h"STACK_LIST *CreatStackList()
{STACK_LIST *p = malloc(sizeof(STACK_LIST));p->phead = NULL;p->clen = 0;return p;
}int IsEmptyStack(STACK_LIST *plist)
{return NULL == plist->phead;
}int PushHeadSTACK(STACK_LIST *plist,int data)
{STACK_NODE *p = malloc(sizeof(STACK_NODE));p->pnext = plist->phead;p->data = data;plist->phead = p;plist->clen++;return 0;
}int PopHeadSTACK(STACK_LIST *plist,int *data)
{if(IsEmptyStack(plist)){return -1;}STACK_NODE *p = plist->phead;plist->phead = p->pnext;if(data != NULL){*data = p->data;}free(p);plist->clen--;return 0;
}int GetTopOfStack(STACK_LIST *plist,int *num)
{if(IsEmptyStack(plist)){return 0;}STACK_NODE *p = plist->phead;*num = p->data;return 0;
}int ClearStack(STACK_LIST *plist)
{if(IsEmptyStack(plist)){return 0;}STACK_NODE *p = plist->phead;while(p){PopHeadSTACK(plist,NULL);p = plist->phead;}return 0;
}void DestoryStack(STACK_LIST *plist)
{ClearStack(plist);free(plist);return ;
}int StackLength(STACK_LIST *plist)
{return plist->clen;
}int ErgodicOfStack(STACK_LIST *plist)
{if(IsEmptyStack(plist)){return 0;}STACK_NODE *p = plist->phead;while(p){printf("%d ",p->data);p = p->pnext;}putchar('\n');return 0;
}

###结果:
在这里插入图片描述
以上就是今天内容!

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

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

相关文章

【收藏】什么是API测试?这是我见过的最全的测试指南!

在最近的部署中&#xff0c;当我被问到“什么是API测试&#xff1f;”时&#xff0c;我正与客户一起制定API测试策略。那时我突然意识到&#xff0c;要描述API测试居然是一件如此具有挑战性的事情&#xff0c;即使你如实地描述了它&#xff0c;也往往听起来很无聊和复杂。 好吧…

第十二届蓝桥杯省赛CC++ 研究生组

十二届省赛题 第十二届蓝桥杯省赛C&C 研究生组-卡片 第十二届蓝桥杯省赛C&C 研究生组-直线 第十二届蓝桥杯省赛C&C 研究生组-货物摆放 第十二届蓝桥杯省赛C&C 研究生组-路径 第十二届蓝桥杯省赛C&C 研究生组-时间显示 第十二届蓝桥杯省赛C&C 研究生组…

AI PPT生成工具 V1.0.0

AI PPT是一款高效快速的PPT生成工具&#xff0c;能够一键生成符合相关主题的PPT文件&#xff0c;大大提高工作效率。生成的PPT内容专业、细致、实用。 软件特点 免费无广告&#xff0c;简单易用&#xff0c;快速高效&#xff0c;提高工作效率 一键生成相关主题的标题、大纲、…

TCP | TCP协议格式 | 三次握手

1.TCP协议 为什么需要 TCP 协议 &#xff1f;TCP 工作在哪一层&#xff1f; IP网络层是不可靠的&#xff0c;TCP工作在传输层&#xff0c;保证数据传输的可靠性。 TCP全称为 “传输控制协议&#xff08;Transmission Control Protocol”&#xff09;。 TCP 是面向连接的、可靠…

YOLOV9训练自己的数据集

1.代码下载地址GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 2.准备自己的数据集 这里数据集我以SAR数据集为例 具体的下载链接如下所示&#xff1a; 链接&#xff1a;https:/…

备战蓝桥杯Day34 - 每日一题

题目描述 解题思路 1.输入数据n&#xff0c;并将字符串类型转换成整数类型 2.求出输入n是2的几次幂&#xff08;调用math库中的求对数的方法&#xff09;&#xff0c;在下面的循环中要用到 3.定义sum和&#xff0c;将抽取到的牌的总数加起来存储 4.count 0 # 记录 2 的第几…

算法打卡day20|二叉树篇09|Leetcode 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

算法题 Leetcode 669. 修剪二叉搜索树 题目链接:669. 修剪二叉搜索树 大佬视频讲解&#xff1a;修剪二叉搜索树视频讲解 个人思路 把这道题想复杂了&#xff0c;还想着如何去重构树 解法 递归法 依旧递归三步走 1.确定递归函数的参数以及返回值 这题递归需要返回值&#…

探索人工智能基础:从概念到应用【文末送书-42】

文章目录 人工智能概念人工智能基础【文末送书-42】 人工智能概念 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;作为当今科技领域的热门话题&#xff0c;已经深刻地影响着我们的生活和工作。但是&#xff0c;要理解人工智能&#xff0c;我们首先需…

【OpenSSH】Windows系统使用OpenSSH搭建SFTP服务器

【OpenSSH】Windows系统使用OpenSSH搭建SFTP服务器 文章目录 【OpenSSH】Windows系统使用OpenSSH搭建SFTP服务器一、环境说明二、安装配置步骤1.下载完成后&#xff0c;传至服务器或者本机并解压至C:/Program Files/目录下2.打开PowerShell终端3.进入到包含ssh可执行exe文件的文…

物联网和工业物联网的区别——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网&#xff08;IoT&#xff09;和工业物联网&#xff08;IIoT&#xff09;作为现代科技的重要分支&#xff0c;正在逐渐渗透到我们的日常生活和工业生产中。它们的应用范围广泛&#xff0c;涵盖了从智能家居到自动化工厂的多个领域。…

类于对象(上)--- 类的定义、访问限定符、计算类和对象的大小、this指针

在本篇中将会介绍一个很重要和很基础的Cpp知识——类和对象。对于类和对象的篇目将会有三篇&#xff0c;本篇是基础篇&#xff0c;将会介绍类的定义、类的访问限定符符和封装、计算类和对象的大小、以及类的 this 指针。目录如下&#xff1a; 目录 1. 关于类 1.1 类的定义 2 类…

Windows Insiders WSLg Linux GUI App 支持尝鲜

2021 年 4 月 21 日&#xff0c;微软在 Developer Blogs 发布了 Windows 预览版 WSL&#xff08;Windows Linux 子系统&#xff09; 对 Linux GUI App 的支持的公告&#x1f517;&#xff0c;碰巧&#x1f600;我最近重装了波电脑&#xff0c;系统换成了 Windows Insiders&…

Python Flask框架 -- 模版渲染、模版访问对象属性、过滤器与自定义过滤器

模版渲染 使用 render_template 来渲染模板 from flask import Flask, render_templateapp Flask(__name__)app.route(/blog/<blog_id>) def blog_detail(blog_id):return render_template(blog_detail.html, blog_idblog_id, username核)if __name__ __main__:app.r…

ByteTrack多目标跟踪——YOLOX详解

文章目录 1 before train1.1 dataset1.2 model 2 train2.1 Backbone2.2 PAFPN2.3 Head2.3.1 Decoupled Head2.3.2 anchor-free2.3.3 标签分配① 初步筛选② simOTA 2.3.4 Loss计算 项目地址&#xff1a; ByteTrack ByteTrack使用的检测器是YOLOX&#xff0c;是一个目前非常流行…

C++程序变量的引用

在C中&#xff0c;变量的“引用” 就是变量的别名&#xff0c;因此引用又称为别名。由于引用不是独立的变量&#xff0c;编译系统不给它单独分配存储单元&#xff0c;因此在建立引用时只有声明&#xff0c;没有定义&#xff0c;只是声明它和原有的某一变量的关系。 一、引用变更…

企业员工培训考试系统开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 随着企业对员工培训的重视程度不断提高&#xff0c;传统的线下培训方式已经无法满足现代企业的需求。为了提高培训效果&#xff0c;降低培训成本&#xff0c;需要开发一款企业员工培训考试系统&#xff0c;通过在线课…

马蹄集oj赛(双周赛第二十三次)

目录 数列分割 小码哥的地毯 小码哥的三色墙 palace 高数考试 新全排列 黑白双煞 等差 数三角形 区间修改 相对马高 小码哥剪绳子 数列分割 难度:黄金 时间限制:1秒巴 占用内存:64 M 小码哥给你一个长度为n的数列&#xff0c;求将该数列分割成两个左右两个部分且两…

OceanPen Art AI绘画系统 运营教程(二)AI视频AI创作PPT

在一个崇高的目标支持下&#xff0c;不停地工作&#xff0c;即使慢&#xff0c;也一定会获得成功。 —— 爱因斯坦 演示站点&#xff1a; ai.oceanpen.art 官方论坛&#xff1a; www.jingyuai.com 登陆后台 ppt密匙设置 导航菜单配置 Key池管理 二、前端显示 体验站点…

哲♂学家带你深♂入了♂解结构体及结构体内存大小问题

目录 概要 一、结构体的声明 二、结构体变量的创建和初始化 三、结构体的特殊声明 四、结构体内存对齐 1、对齐原则 2、例一 对齐数 计算方法 3、例二 总结 概要 结构体是我们日常编程中经常要用到的一种自定义类型&#xff0c;使用起来也是十分的方便。接下来就由…

计算机二级Python题目3

题目来源&#xff1a;计算机二级Python半个月抱佛脚大法&#xff08;内呈上真题版&#xff09; - 知乎 目录 1. 基础题 1.1 基础题1 1.2 基础题2 1.3 基础题3 2. turtle绘图题 3. 大题 3.1 大题1 3.2 大题2 1. 基础题 1.1 基础题1 a,b,ceval(input()) ls[] for i in …