数据结构--栈

news2024/11/23 22:13:11

一、栈

        数组是一种连续存储、随机访问的线性表,链表属于分散存储、连续访问的线性表。它们每个数据都有其相对位置,有至多一个直接前驱和之多一个直接后继。栈(Stack)和队列(Queue)也属于线性表,但它们都是运算受限的线性表,因此也称限定性线性表。栈限定数据只能在栈顶执行插入(入栈)和删除(出栈)操作。列队限定只能在队头执行删除操作(出队),在队尾执行插入操作(入队)。

        栈的结构如图1所示。(遵循先入后出)

        对栈进行运算的一端称为栈顶(top),栈顶的第一个元素称为栈顶元素。向一个栈中插入新元素,即把该元素放到栈顶元素的上面,使其称为新的栈顶元素,称为压入堆栈(Push)。从一个栈中删除元素,使原栈顶元素下方的的相邻元素成为新的栈顶元素,称为弹出堆栈(Pop)。栈的这种运算方式使其具有后进先出(Last Input First Output ,LIFO)的特性。

        栈的一个典型应用是表达式求值。表达式求值是程序设计语言编译中的一个最基本的问题。

        以二元算术运算符为例,算术表达式的一般形式为s1+op+s2,则op+s1+s2为前缀表示法(也成为波兰表达式),s1+op+s2为中缀表示法,s1+s2+op为后缀表示法(也成为逆波兰表达式)。例如,对于表达式a*b+(c-d/e)*f,则其前缀表达式+ * ab-c/def,中缀表达式为a*b+(c-d/e)*f,后缀表达式为ab*cde/-f*+。

        用栈计算逆波兰表达式的基本思路是:按顺序遍历整个表达式,若遇到操作数(假设都是二元运算符),则入栈,若遇到操作符,则连续弹出两个操作数并执行相应的运算,然后将其运算结果入栈。重复以上过程,直到数组遍历完,栈内只剩下一个操作数时,那就是最终的运算结果,弹出打印即可。

例题1:用栈的顺序存储结构实现逆波兰表达式求值程序:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define INT 1
#define FLT 2
#define N 20
typedef struct node
{
	int ival;
 }Nodetype;
typedef struct stack
{
	Nodetype data[N];
	int top;			//控制栈顶 
}STACK;					//栈的顺序存储 
void push(STACK *stack,Nodetype data);
Nodetype pop(STACK *stack);
Nodetype opint(int d1,int d2,int op);
Nodetype opdata(Nodetype *d1,Nodetype *d2,int op);
int main(void)
{
	char word[N];
	Nodetype d1,d2,d3;
	STACK stack;
	stack.top=0;		//初始化栈顶
	//以空格为分隔符输入逆波兰表达式,以#结尾 
	while(scanf("%s",word)==1&&word[0]!='#')
	{
		if(isdigit(word[0]))		//若为数字,则转换为整型后压入栈 
		{
			d1.ival=atoi(word);		//将word转为整型数据 
			push(&stack,d1);
		}
		else						//否则弹出两个操作数,执行相应运算后再将结果压入栈 
		{
			d2=pop(&stack);
			d1=pop(&stack);
			d3=opdata(&d1,&d2,word[0]);	//执行运算 
			push(&stack,d3);			//运算结果压入堆栈 
		}
	}
	d1 = pop(&stack);					//弹出栈顶保存的最终计算结果 
	printf("%d\n",d1.ival);
	return 0;
}
//函数功能:将数据data压入堆栈 
void push(STACK *stack,Nodetype data)
{
	memcpy(&stack->data[stack->top],&data,sizeof(Nodetype));
	stack->top=stack->top+1;
}
//函数功能:弹出栈顶数据并返回 
Nodetype pop(STACK *stack)
{
	stack->top = stack->top-1;		//改变栈顶指针 
	return stack->data[stack->top];
}
//函数功能:对整型的数据d1和d2执行执行运算op,并返回就算结果 
Nodetype opint(int d1,int d2,int op)
{
	Nodetype res;
	switch(op)
	{
		case '+':
			res.ival=d1+d2;
			break;
		case '-':
			res.ival=d1-d2;
			break;
		case '*':
			res.ival=d1*d2;
			break;
		case '/':
			res.ival=d1/d2;
			break;
	}
	return res;
}
//函数功能:对d1和d2执行运算op,并返回计算结果 
Nodetype opdata(Nodetype *d1,Nodetype *d2,int op)
{
	Nodetype res;
	res = opint(d1->ival,d2->ival,op);
	return res;
}

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

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

相关文章

什么耳机带着舒服?这几款耳机戴过的人都说好

骨传导耳机凭借不入耳就能轻松听音乐的特点&#xff0c;被越来越多人所认识&#xff0c;相比传统的入耳式耳机&#xff0c;骨传导耳机拥有更多的可玩性&#xff0c;比如说跑步、游泳、健身都可以佩戴骨传导耳机&#xff0c;即使长时间佩戴也不会出现不适感&#xff0c;也不会出…

《CSDN铁粉经济学:如何快速涨粉并转化为铁粉》

目录 一、铁粉的定义 二、获取铁粉的方法 要获取铁粉&#xff0c;首先需要拥有粉丝。 &#x1f9e9;粉丝与铁粉的关系 &#x1f525;热榜与领域榜 三、我的创作路程 四、总结 首先解释什么是铁粉&#xff1a;官方定义为&#xff0c;在90天内阅读、购买专栏或其他互动&…

IP地址划分

1 IP 地址的格式 IP 地址 网络地址 主机地址 如果 IP 进行了子网划分&#xff1a; 则IP地址网络地址子网地址主机地址 网络地址是互联网上的节点在网络中具有的逻辑地址。 MAC 地址&#xff1a;处于数据链路层&#xff1b;IP 地址&#xff1a;处于网络层&#xff1b;端口号…

部署jenkins(使用华为云war包,手动制作jenkins镜像)

部署jenkins&#xff08;使用华为云war包&#xff0c;手动制作jenkins镜像&#xff09; 环境准备制作jenkins镜像启动jenkins服务进入jenkins登录页 配置jenkins用户配置jenkins代理通道 环境准备 1、JDK镜像准备docker pull openjdk:8-jdk-oracle 2、jenkins的war包准备 http…

adb shell dumpsys SurfaceFlinger

adb shell dumpsys SurfaceFlinger adb shell dumpsys SurfaceFlinger分析Android 系统图层 此命令输出的内容不较多&#xff0c;可以将输出内容重定向到一个文件中 adb shell dumpsys SurfaceFlinger > ./Downloads/surface.txt如下的内容&#xff0c;过滤HWC layers 另外…

第六章 NVMe 介绍

6.4 寻址双雄&#xff1a;PRP 和 SGL 1. 主机往 SSD 写入用户数据 2. 主机读取 SSD 上的用户数据 在上面两个过程中&#xff0c;主机在与 SSD 的数据传输过程中&#xff0c;主机是被动的一方&#xff0c;SSD 是主动的一方。即&#xff0c;主机需要数据&#xff08;读数据&#…

JVM重点整理

一、虚拟机架构图 二、类加载过程 类加载器的作用&#xff1a;负责把class文件加载到内存中 类加载过程&#xff1a; 加载&#xff1a; 通过类的全限定名获取此类的二进制字节流文件的编码结构---->运行时的内存结构内存中生成一个class对象 链接&#xff1a; 验证&#x…

LangChain大型语言模型(LLM)应用开发(五):评估

LangChain是一个基于大语言模型&#xff08;如ChatGPT&#xff09;用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

【状态估计】基于UKF法、AUKF法、EUKF法电力系统三相状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【PHP面试题40】能够使HTML和PHP分离开使用的模板技术有哪些

文章目录 一、前言二、模板技术的好处三、常用的模板技术3.1 PHP模板引擎3.2 前端模板引擎3.3 前后端分离技术 四、Smarty模板使用演示4.1 在项目中引入Smarty模板引擎的文件4.2 引入Smarty.class.php文件4.3 创建一个Smarty对象4.4 变量定义4.5 创建一个Smarty模板文件4.6 绑定…

【C语言】念数字

问题描述&#xff1a; 输入一个整数&#xff0c;输出每个数字对应的拼音。当整数为负数时&#xff0c;先输出fu字。 输入格式&#xff1a; 输入在一行中给出一个整数&#xff0c; 如&#xff1a;1234。 提示&#xff1a;整数包括负数、零和正数。 输出格式&#xff1a; 在一…

【C语言】2-C 语言程序构建过程以及 C 语言的程序结构

1. 程序构建过程 1.1 什么是计算机语言 1.1.1 机器语言 计算机只能识别二进制,也就是说只能识别由 0 和 1 组成的指令。在计算机发展的初期,一般计算机的指令长度为 16,即用 16 个二进制数(0 或 1)组成一条指令,16 个 0 和 1 可以组成各钟排列组合。例如用 0011 1100…

Cyclo(RRRRRRR) , NP213 TFA,多肽合成,碱性侧链氨基酸

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ -----产品描述---- 环肽试剂Cyclo(RRRRRRR)&#xff0c;属于7个精氨酸的多肽合成&#xff0c;碱性侧链氨基酸这些保护基在合成过程中稳定&#xff0c;无副反应&#xff0c;合成结束后可以完全定量的脱除。 -----试剂信息--…

基于C语言的学生成绩管理系统

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

jmeter命令行运行(非GUI形式)参数详解

目录 一、JMete执行方式 二、JMete非GUI运行优点 三、jmeter非GU运行参数 四、jmeter非GUI运行命令 4.1非GUI基本命令格式&#xff1a; 4.2非GUI并生成html报告基本命令格式 总结&#xff1a; 一、JMete执行方式 正常情况下我们会以有页面的方式打开jmeter编写接口&…

lvs使用

1.前言 LVS&#xff08;Linux Virtual Server&#xff09;是一个基于 Linux 内核的负载均衡器&#xff0c;用于分发网络流量和将请求转发给后端服务器。LVS 提供了多种负载均衡算法和转发模式&#xff0c;以满足不同场景和需求的负载均衡需求 2.lvs功能 LVS 提供了三种负载均…

React在Dva项目中创建并引用页面局部组件

这篇文章我们演示Dva中编写组件的方式 官方这里也特意强调了UI这个关键词 跟多是作为我们界面元素的组件 而不是页面路由 我们要单独做路由的组件肯定还是直接放在我们Dva项目的src下的routes目录下就好了 然后 我们看 项目 src下有一个 components 目录 一般我们做什么前端项…

连接区块链节点的 JavaScript 库 web3.js

文章目录 前言web3.js 介绍web3.js安装web3.js库模块介绍连接区块链节点向区块链网络发送数据查询区块链网络数据 前言 通过前面的文章我们可以知道基于区块链开发一个DApp&#xff0c;而DApp结合了智能合约和用户界面&#xff08;客户端&#xff09;&#xff0c;那客户端是如…

TCP三次握手、数据传输与四次挥手

一、建立TCP连接 —— 三次握手 &#xff08;1&#xff09;客户端向服务端发送一个携带初始序列号的SYN包。 &#xff08;2&#xff09;服务端收到后将其加入到半连接队列&#xff0c;然后向客户端回复携带初始序列号的SYNACK包。 &#xff08;3&#xff09;客户端收到后再向服…

ModelAttribute用法详解

目录 官方解释 例子 使用场景1 使用场景2 场景3 官方解释 首先看一下官方文档上该注解的解释&#xff1a; 可以看到ModelAttribute可以用在参数上&#xff0c;也可以用在方法上&#xff1a; Can be used to expose command objects to a web view, using specific attribu…