栈——数据结构——day4

news2024/11/13 18:55:25

栈的定义

栈是限定仅在一段进行插入和删除操作的线性表。
我们把允许插入和删除的一端称为栈顶(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.coloradmin.cn/o/1536921.html

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

相关文章

开源项目ChatGPT-Next-Web的容器化部署(三)-- k8s deployment.yaml部署

一、说在前面的话 有了docker镜像&#xff0c;要把一个项目部署到K8S里&#xff0c;主要就是编写deployment.yaml。 你需要考虑的是&#xff1a; 环境变量服务的健康检测持久化启动命令程序使用的数据源程序使用的配置文件 因为本前端项目比较简单&#xff0c;这里只做一个…

重学SpringBoot3-Profiles介绍

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-Profiles介绍 Profiles简介如何在Spring Boot中使用Profiles定义Profiles激活ProfilesIDEA设置active profile使用Profile-specific配置文件 条件化Bean…

Python爬虫案例-爬取主题图片(可以选择自己喜欢的主题)

2024年了&#xff0c;你需要网络资源不能还自己再慢慢找吧&#xff1f; 跟着博主一块学习如何利用爬虫获取资源&#xff0c;从茫茫大海中寻找那个她到再妹子群中找妹子&#xff0c;闭着眼睛都可以找到合适的那种。文章有完整示例代码&#xff0c;拿过来就可以用&#xff0c;欢迎…

就业班 第二阶段 2401--3.18 day1 初识mysql

初识&#xff1a; 1、关系型数据库mysql、mariadb、sqlite 二维关系模型 2、非关系型数据库 redis、memcached sql 四个部分 DDL 数据库定义语言 创建数据库&#xff0c;创建用户&#xff0c;创建表 DML 数据库操作语言 增删改 DQL 数据库查询语言 查 DCL 数据库控制语言 授权 …

Pake一键打包,轻松构建桌面级应用!

Pake&#xff1a;顷刻之间&#xff0c;智能封装——WEB到桌面瞬间联通&#xff0c;让网站应用像搭积木般部署 - 精选真开源&#xff0c;释放新价值。 概览 Pake&#xff0c;作为一款新颖且极具创新性的桌面应用开发框架&#xff0c;凭借其独特的技术路径和高效的实现方式&…

时代教育期刊投稿发表

《时代教育》是由成都传媒集团主管主办&#xff0c;中华人民共和国新闻出版总署批准国内公开出版发行的专业教育类期刊&#xff0c;主要刊登各类高等院校、职业技术学校、中小学教师及研究生、教育科研工作者的教育实践研究成果&#xff1b;教育教学行业的最新动态&#xff1b;…

基于SSM+Jsp+Mysql的KTV点歌系统

基于SSMJspMysql的KTV点歌系统 基于SSMJspMysql的KTV点歌系统的设计与实现 开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工…

jvm提供的远程调试 简单使用

JVM自带远程调试功能 JVM远程调试&#xff0c;其实是两个虚拟机之间&#xff0c;通过socket通信&#xff0c;达到远程调试的目的&#xff1b; 前提 确保本地和远程的网络是开通的&#xff1b; 本地操作 远程操作 在启动命令参数中 把上面的内容复制进去

第 6 章 ROS-URDF练习(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 6.3.4 URDF练习 需求描述: 创建一个四轮圆柱状机器人模型&#xff0c;机器人参数如下&#xff0c;底盘为圆柱…

NIVision-相机图像采集

应用场景 上位机与工业相机通讯&#xff0c;控制相机抓取图像。 工业相机的通讯接口大多为USB口或网口。 USB口则直接将通讯线缆插入上位机USB端口&#xff0c;打开MAX中设备与接口一栏可以看到电脑给相机分配的资源名称&#xff1b;网口则需要将网线连接相机和上位机&#xf…

【数据库】SQL Server 2008 R2 安装过程

启动安装程序&#xff0c;点击setup&#xff0c;进入【SQLServer安装中心】 点击界面左侧的【安装】&#xff0c;然后点击右侧的【全新SQLServer独立安装或向现有安装添加功能】&#xff0c;进入【SQLServer2008R2安装程序】界面&#xff0c;如下图所示&#xff1a; 进入【安装…

浅谈Postman与Jmeter的区别、用法

前阶段做了一个小调查&#xff0c;发现软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人…

师徒互电,眼冒金星,采集系统变电刺激系统!

原文来自微信公众号&#xff1a;工程师看海&#xff0c;很高兴分享我的原创文章&#xff0c;喜欢和支持我的工程师&#xff0c;一定记得给我点赞、收藏、分享哟。 加微信[chunhou0820]与作者进群沟通交流 电的我眼冒金星&#xff0c;以为自己被三体召唤&#xff0c;整个世界为我…

预测一下,GPT-5 会在什么时候发布,又会有哪些更新?

发布预期&#xff1a;GPT-5预计将于11月发布&#xff0c;可能与ChatGPT发布两周年同期。竞争态势&#xff1a;谷歌的Gemini与GPT-4 turbo已展开竞争。逐步发布&#xff1a;GPT-5可能通过模型训练过程中的中间检查点逐步发布。训练与安全测试&#xff1a;实际训练可能需3个月&am…

【Java前端技术栈】Vue2、Vue Cli、Axio入门

一、基本介绍 1.Vue 是什么? Vue (读音 /vjuː/&#xff0c;类似于 view) 是一个前端框架, 易于构建用户界面 2. Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或项目整合 3. 支持和其它类库结合使用 4. 开发复杂的单页应用非常方便 5.…

【隐私计算实训营003详解隐私计算框架及技术要点】

1. 隐语架构一览 1.1 隐语架构 隐语架构通常指的是一种面向隐私保护计算的软件框架或解决方案&#xff0c;它采用了密码学、可信执行环境&#xff08;TEE&#xff09;、多方安全计算&#xff08;MPC&#xff09;等多种隐私保护技术来实现在数据加密状态下进行计算&#xff0c;…

咖啡饮品抖音品牌打造流量运营规划方案PPT

【干货资料持续更新&#xff0c;以防走丢】 咖啡饮品抖音品牌打造流量运营规划方案PPT 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑共50页&#xff08;完整资料包含以下内容&#xff09; 目录 抖音品牌打造方案 社交话题引领&#xff0c;内容共创…

一、SpringBoot3 介绍

本章概要 SpringBoot3 简介系统要求快速入门入门总结 1.1 SpringBoot3 简介 此处使用 SpringBoot 版本&#xff1a;3.0.5 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html 无论使用XML、注解、Java配置类还是他们的混合用法&#xff0…

unity3d——沙盒路径

文章目录 Unity3D中不同平台的沙盒路径&#xff1a; 示例 在Unity3D中&#xff0c;尤其是在移动平台如Android和iOS上&#xff0c;由于系统安全机制&#xff0c;应用程序不能直接访问操作系统的所有文件和目录&#xff0c;而是被限制在一个特定的“沙盒”环境中。这个沙盒是一个…

elementUI Tree 树形控件单选实现

文章目录 展示效果代码实现elementui Tree树形控件其他详细数据 在Element UI中&#xff0c;树形控件&#xff08;el-tree&#xff09;本身不支持单选功能。但是&#xff0c;你可以通过监听节点点击事件并手动更新选中状态来实现单选树。 以下是一个简单的例子&#xff0c;展示…