栈——数据结构——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,一经查实,立即删除!

相关文章

从零开始一步一步掌握大语言模型---(2-什么是Token?)

了解自然语言处理或者听说过大语言模型的同学都听过&#xff0c;token。一般来说&#xff0c;它代表的是语言中不可再分的最小单元。我们人类的语言不仅有文字&#xff0c;还有语音。针对文字、语音来说&#xff0c;它们都各自有不同的划分token的方法。本节将尽可能详细的介绍…

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

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

CPU百分百问题如何排查

排查CPU百分百问题通常需要一步一步地识别并解决潜在的原因。以下是一些常见的排查步骤&#xff1a; 查看系统负载&#xff1a;首先&#xff0c;使用系统监控工具比如top查看系统的负载情况。确定是哪个进程导致CPU高占用&#xff1a;查找哪个进程或应用程序的CPU占用率很高。…

遥控按键处理

遥控按键&#xff1a; 编写AndroidTV应用遥控事件怎么处理_mob64ca12e9cad4的技术博客_51CTO博客

第十二届蓝桥杯省赛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:/…

生活电子产品拆解分析~汇总目录

一、锂电池电源 ①电子产品拆解分析-暖手宝 ②电子产品拆解分析-电动牙刷 ③电子产品拆解分析-充电宝台灯 ④电子产品拆解分析-太阳能自动感应灯 ⑤电子产品拆解分析-人体感应灯 ⑥电子产品拆解分析-食物电子秤 ⑦电子产品拆解分析-6600mA充电宝 ⑨电子产品拆解分析-触摸化妆镜…

备战蓝桥杯Day34 - 每日一题

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

nju cs上机

给定一个正整数n(3≤n≤90)&#xff0c;数出长度为n的所有可能的不同二进制串的个数&#xff0c;使得串中没有连续的1出现。 #include<bits/stdc.h> using namespace std; int n; int dp[100][100]; int main(){while(cin >> n){dp[0][0] 1;dp[0][1] 1;for(int …

算法打卡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…

如何在Terraform中覆盖资源参数的.go代码?

要覆盖 Terraform 资源参数的 .go 代码&#xff0c;可以使用 go get 命令将资源的代码复制到本地&#xff0c;进行修改并重新编译。具体步骤如下&#xff1a; 1&#xff09;使用 go get 命令将资源复制到本地&#xff1a; $ go get github.com/terraform-providers/terraform…

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;是一个目前非常流行…