数据结构--栈

news/2024/5/9 22:19:07/文章来源:https://blog.csdn.net/ww1425408527/article/details/131505669

一、栈

        数组是一种连续存储、随机访问的线性表,链表属于分散存储、连续访问的线性表。它们每个数据都有其相对位置,有至多一个直接前驱和之多一个直接后继。栈(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.luyixian.cn/news_show_330237.aspx

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

相关文章

twaver——树中选择子网,拓扑中显示子网里面的拓扑

twaver.network.Network.setCurrentSubNetwork ( currentSubNetwork [animate] [finishFunction] ) 将当前子网设置为指定子网&#xff0c;并且可以设置是否有动画效果&#xff0c;而且能指定设置当前子网结束后执行的动作 Parameters: currentSubNetwork twaver.SubNetwork 子…

【UT学习记录】

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 Part1&#xff1a;Mock Part2&#xff1a;PowerMock Part3:Junit 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文…

即插即用篇 | YOLOv8 引入具备跨空间学习的高效多尺度注意力 Efficient Multi-Scale Attention | 《ICASSP 2023 最新论文》

论文地址:https://arxiv.org/vc/arxiv/papers/2305/2305.13563v1.pdf 该论文展示了通道或空间注意机制在各种计算机视觉任务中产生更明显的特征表示的显著效果。然而,通过通道维度缩减来建模跨通道关系可能会在提取深度视觉表示方面带来副作用。本文提出了一种新颖高效的多尺…

ES6——Promise

promise 含义&#xff1a;异步编程解决方案 特点&#xff1a;1、状态不受外界影响&#xff0c;状态有三种&#xff1a;pending、fulfilled、rejected 2、状态不可逆&#xff0c;只能pending -> fulfilled、pending -> rejected 缺点&#xff1a;无法取消、不设置回调函…

C语言联合体

一、联合体的概念 联合 (union) 是一个能在同一个存储空间里 ( 但不同时) 存储不同类型数据的复合数据类型。 大致结构如下&#xff1a; n union foo /* 定义一个联合类型foo */ n { q int digit; q double bigfl[10]; q char letter; n }baz; /* 定义一个example类型的联合变量…

JVM (simple Version)

简介 JVM 其实就是一个Java进程 , 从操作系统申请一大块内存区域, 供 java 代码使用 . 申请出的内存 , 进一步划分 , 给出不同的用途 . JVM 内存区域划分 : 堆中存放就是 new 出来的对象. (成员变量) 栈 是用来维护方法之间的调用关系 (局部变量) 元数据区(或者叫方法区) 存放的…

计算机毕设 大数据房价数据分析及可视化 - python 房价分析

文章目录 1 课题背景2 数据爬取2.1 爬虫简介2.2 房价爬取 3 数据可视化分析3.1 ECharts3.2 相关可视化图表 4 最后 1 课题背景 房地产是促进我国经济持续增长的基础性、主导性产业。如何了解一个城市的房价的区域分布&#xff0c;或者不同的城市房价的区域差异。如何获取一个城…

自动驾驶与智能网联场地测试一体化装备应用

自动化驾驶层级与结构 L1:能够辅助驾驶员玩车某些驾驶任务制动防抱死系统 (ABS),车身电子稳定系统 (ESP)等,这些配置就是L1级别的运用。 L2:部分自动化,在L2的级别里,必须要具备的是自适应巡航系统,主动车道保持系统自动刹车辅助系统以及自动泊车系统等系统。 L3:有条件…

Qt + QR-Code-generator 生成二维码

0.前言 之前使用 libgrencode 生成二维码&#xff0c;LGPL 协议实在不方便&#xff0c;所以需要找一个 github 星星多的&#xff0c;代码简单最好 header-only&#xff0c;协议最好是 MIT 或者兼容协议而不是 GPL 或者 LPGL。 QR-Code-generator 正好符合这个要求&#xff0c…

Linux和Shell笔记-1相关概念理解

Unix和Linux关系 UNIX是最早的商业操作系统之一&#xff0c;由贝尔实验室&#xff08;AT&T Bell Laboratories&#xff09;于 1970 年代开发。UNIX 是一个多用户、多任务的操作系统&#xff0c;具有强大的命令行界面和可扩展性。 Linux 是一个开放源代码的类 UNIX 操作系统…

​LeetCode解法汇总931. 下降路径最小和

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matr…

小白到运维工程师自学之路 第五十一集 (三剑客之sed)

一、概述 sed是一个流式文本编辑器&#xff0c;可以对文本进行搜索、替换、删除等操作。它是一个非交 互式的命令行工具&#xff0c;通常用于处理大量的文本数据。sed的工作方式是逐行读取输入文 本&#xff0c;按照预定义的命令对每一行进行处理&#xff0c;并输出结果。它…

使用STM32 再实现电动车防盗钥匙扣

实现目标 1. 点击遥控器 A 按键&#xff0c;系统进入警戒模式&#xff0c;一旦检测到震动&#xff08;小偷偷车&#xff09;&#xff0c;则喇叭发出声响报警 2. 点击遥控器 B 按键&#xff0c;系统退出警戒模式&#xff0c;再怎么摇晃系统都不会报警 硬件介绍 1. 震动传感器…

解决uniapp运行手机基座出现的问题

常见的问题&#xff1a;&#xff08;往往在更新编辑器版本后会出现以下问题&#xff09; 问题1.明明已经连接到手机&#xff0c;就是检测不到设备 问题2.同步资源失败&#xff0c;未得到同步资源的授权 解决办法汇总 问题1解决办法&#xff1a; 方法一&#xff1a;进入HBuild…

【socket编程】TCP服务器、UDP服务器、本地套接字【C语言代码实现】

目录 0. 准备知识 0.1 大小端概念 0.2 网络字节序和主机字节序的转换 0.3 点分十进制串转换&#xff08;IP地址转换函数&#xff09; 0.4 IPV4结构体&#xff1a;&#xff08;man 7 ip&#xff09; 0.5 IPV6套接字结构体&#xff1a;&#xff08;man 7 ipv6&#xff09; …

实现跨语言互动:如何在Python中调用Java的JavaParser库解析Java源代码

1、背景 在多语言开发环境中&#xff0c;我们经常需要进行跨语言的操作。有时&#xff0c;我们可能会在Python环境下需要使用Java的库或者功能。这个博客将展示如何在Python中调用Java的JavaParser库来解析Java源代码。 2、需求 在许多软件开发场景中&#xff0c;我们可能需…

【算法与数据结构】239、LeetCode滑动窗口最大值

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题我们如果用暴力破解法需要 O ( n ∗ k ) O(n*k) O(n∗k)的复杂度。思索再三&#xff0c;我们需要…

【新版系统架构】第十九章-大数据架构设计理论与实践

大数据处理系统架构 大数据处理系统面临挑战 如何利用信息技术等手段处理非结构化和半结构化数据如何探索大数据复杂性、不确定性特征描述的刻画方法及大数据的系统建模数据异构性与决策异构性的关系对大数据知识发现与管理决策的影响 大数据处理系统架构特征 鲁棒性和容错…

【基于FPGA的芯片设计】RISC-V的20条指令CPU设计

实验板卡&#xff1a;xc7a100tlc sg324-2L&#xff0c;共20个开关 实验要求&#xff1a;

危机现场 | 如果给你25万美元,你会登上泰坦号吗?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 小黑 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 这是我们更名为记者下班后的第一期节目&#xff0c;临时把危机现场&#xff08;原为死神来了&#xff09…