数据结构--栈的应用

使用栈实现表达式求值 任何一个表达式都是由操作数,运算符,界限符组成的。操作数即是参加运算的数值或者变量,运算符则是加减乘除等组成,为简单起见,这里只实现加减乘除的运算,而常见的界限符则是左右括号和终止符。在运算过程中,要判断两个先后出现的运算符之间的优先顺序。 为了实现算法,设置两个工作栈:用于存储运算符的栈opter,以及用于存储操作数及中间结果的栈opval。 算法基本思想如下: (1)首先将操作数栈opv 阅读详情

 要求:首先将操作数栈opnd设为空栈,而将'#'作为运算符栈opter的栈底元素,这样的目的是判断表达式是否求值完毕;(2)依次读入表达式的每个字符,表达式须以'#'结尾,若是操作数则入栈opnd,若是运算符,则将此运算符c与opter的栈顶元素top比较优先级后执行相应的操作,具体操作如下:(i)若top的优先级小于c,即top<c,则将c直接入栈opter,并读入下一字符赋值给c;(ii)若top的优先级等于c,即top=c,则弹出opter的才顶元素,并读入下一字符赋值给c,这一步目的是进行括号操作。

#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
	char *base;
	char *top;
	int stacksize;
}SqStack;

typedef struct{
	int *base;
	int *top;
	int stacksize;
}SqStacknum;
int InitStack(SqStack *S)
{
	S->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
	if (!S->base) exit(0);
	S->top = S->base;
	S->stacksize = STACK_INIT_SIZE;
	return 1;
}
int InitStacknum(SqStacknum *S)
{
	S->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
	if (!S->base) exit(0);
	S->top = S->base;
	S->stacksize = STACK_INIT_SIZE;
	return 1;
}
char GetTop(SqStack S)
{
	char e;
	if (S.top == S.base) return 0;
	e = *(S.top - 1);
	return e;
}
int GetTopnum(SqStacknum S)
{
	int e;
	if (S.top == S.base) return 0;
	e = *(S.top - 1);
	return e;
}
int Push(SqStack *S, char e)
{
	if (S->top - S->base >= S->stacksize)
	{
		S->base = (char *)realloc(S->base,
			(S->stacksize + STACKINCREMENT) * sizeof(char));
		if (!S->base) exit(0);
		S->top = S->base + S->stacksize;
		S->stacksize += STACKINCREMENT;
	}
	*S->top++ = e;
	return 1;
}
int Pushnum(SqStacknum *S, int e)
{
	if (S->top - S->base >= S->stacksize)
	{
		S->base = (int *)realloc(S->base,
			(S->stacksize + STACKINCREMENT) * sizeof(int));
		if (!S->base) exit(0);
		S->top = S->base + S->stacksize;
		S->stacksize += STACKINCREMENT;
	}
	*S->top++ = e;
	return 1;
}
int Pop(SqStack *S, char *e)
{
	if (S->top == S->base) return 0;
	*e = *--S->top;
	return 1;
}
int Popnum(SqStacknum *S, int *e)
{
	if (S->top == S->base) return 0;
	*e = *--S->top;
	return 1;
}
int Operate(int a, char theta, int b)
{
	switch (theta)
	{
	case '+':
		return a + b;
	case '-':
		return a - b;
	case '*':
		return a * b;
	case '/':
		return a / b;
	}
	//printf("No this theta");
	//printf("%c^",theta);
}
int In(char c)
{
	switch (c)
	{
	case '+':
		return 0;
	case '-':
		return 0;
	case '*':
		return 0;
	case '/':
		return 0;
	case '(':
		return 0;
	case ')':
		return 0;
	case '#':
		return 0;
	}
	return 1;
}
int getIndex(char theta)   //获取theta所对应的索引
{
	int index = 0;
	switch (theta)
	{
	case '+':
		index = 0;
		break;
	case '-':
		index = 1;
		break;
	case '*':
		index = 2;
		break;
	case '/':
		index = 3;
		break;
	case '(':
		index = 4;
		break;
	case ')':
		index = 5;
		break;
	case '#':
		index = 6;
	default:break;
	}
	return index;
}
char getPriority(char theta1, char theta2)   //获取theta1与theta2之间的优先级
{
	const char priority[][7] =     //算符间的优先级关系
	{
		{ '>', '>', '<', '<', '<', '>', '>' },
		{ '>', '>', '<', '<', '<', '>', '>' },
		{ '>', '>', '>', '>', '<', '>', '>' },
		{ '>', '>', '>', '>', '<', '>', '>' },
		{ '<', '<', '<', '<', '<', '=', '0' },
		{ '>', '>', '>', '>', '0', '>', '>' },
		{ '<', '<', '<', '<', '<', '0', '=' },
	};
	int index1 = getIndex(theta1);
	int index2 = getIndex(theta2);
	return priority[index1][index2];
}
int main()
{
	char theta, c, x, l;
	int a, b;
	SqStack OPTR;
	SqStacknum OPND;
	printf("please input some things\n");
	InitStack(&OPTR); //运算符
	Push(&OPTR, '#'); //操作数
	InitStacknum(&OPND);
	c = getchar();
	while (c != '#' || GetTop(OPTR) != '#')
	{
		if (In(c))
		{
			Pushnum(&OPND, (int)c - 48);
			c = getchar();
		}
		else
		{
			switch (getPriority(GetTop(OPTR), c))
			{

			case '<':
				Push(&OPTR, c);
				c = getchar();
				break;
			case '=':
				Pop(&OPTR, &x);
				c = getchar();
				break;
			case '>':
				Pop(&OPTR, &theta);
				Popnum(&OPND, &b);
				Popnum(&OPND, &a);
				Pushnum(&OPND, Operate(a, theta, b));
				break;
			}
		}
	}
	printf("%d", GetTopnum(OPND));
}

 

 

《数据结构》--栈【概念应用、图文并茂】 线性表的学习体系,栈(Stack-LIFO)的概念,顺序栈与链栈,单调栈专题,共享栈专题,栈的算法应用:递归专题,四则运算表达式专题(前缀表达式、后缀表达式、中缀表达式),逆波兰表达式的题解。 阅读详情

相关推荐

TPL5010硬件看门狗电路

在做一些采集频率很低的产品的时候,会考虑电池供电,比如表、电气表等,为了控制功耗,往往会在设备不需要工作的时候让它进入低功耗模式。为了设备的稳定性,避免死机后无法恢复,必须配置看门狗,一般的看门狗芯片,喂狗间隔时间是几秒钟。这样在喂狗和低功耗之间就产生了一个矛盾,频繁的喂狗就需要频繁的醒过来,这样功耗就很难做到很低。这颗看门狗芯片,特别适合上面的应用。2小时的间隔意味着主控芯片每2小时醒过来喂狗一次即可,而在2.5V供电的情况下,功耗仅仅35nA,几乎可以忽略不计。

zxm8513优快云博客 3309

数据结构 实验2——表达式求值

一、实验名称:表达式求值 二、实验学时:6学时 三、实验目的 1.理解栈的结构特点和基本操作特性; 2.掌握利用栈实现表达式求值算法。 四、实验内容(步骤) 输入一个算术表达式(以“=”结束),求其值。要求表达式以“=”结束,操作数为多位实数,对错误表达式要进行检测。 1.设置两个栈:optr算符栈和opnd操作数栈。初始置opnd为空栈;起始符“=”为optr的栈底元素; 2.自左向右扫描表达式中的每个字符c: 1)若c为操作数,则进opnd栈; 2)若c为算符,则让optr栈的栈顶元

m0_57587757的博客 1万+

从零到一:RF-DETR如何通过神经架构搜索重塑实时目标检测的边界

RF-DETR通过创新的权重共享神经架构搜索(NAS)机制,重新定义了实时目标检测的技术边界。这项技术在COCO等基准测试中表现卓越,成为首个AP超过60的实时检测器,同时保持跨领域稳定性和高效推理速度。RF-DETR的动态架构调整能力使其能够适应从嵌入式设备到云端服务器的各种硬件环境,为工业质检、自动驾驶等场景提供灵活解决方案。

weixin_29061531的博客 469

5.8 案例分析与实现

表达式树提供了一种有效的方式来处理和求值复杂的算术表达式。通过构建表达式树,可以将中缀表达式转换为一种可以直观理解和易于计算的树形结构。表达式树的构建和求值算法不仅展示了数据结构在算法设计中的应用,也体现了栈和树这两种基本数据结构的强大功能和灵活性。通过实现这些算法,我们可以深入理解算术表达式的处理过程,以及栈和树在算法中的应用。

tang7mj的博客 522

电源完整性仿真流程梳理

可根据仿真流程导图,一步一步的去设置完成仿真。仿真的关键,在于对电路回路的理解以及所放置的电压源与电流的合理性,对于去耦电容的选择,则需要根据谐振频率计算,从而选取有效滤波的容值。

csy17729158342的博客 3442

KIBANA可视化管理界面说明

更说明转自https://blog.youkuaiyun.com/IT_ZRS/article/details/125496588 1 主要结构功能 使用浏览器访问 ip:5601 默认端口,进入首页 Discover:日志管理视图 主要进行搜索和查询 Visualize:统计视图 构建可视化的图表 Dashboard:仪表视图 将构建的图表组合形成图表盘 Timelion:时间轴视图 随着时间流逝的数据 APM:性能管理视图 应用程序的性能管理系统 Canvas:大屏展示

tian830937的专栏 7086

入栈和出栈的基本操作

综上所述,入栈和出栈作为栈的基本操作,在数据结构和算法中具有重要地位。通过入栈和出栈操作,可以方便地实现运算符的优先级处理和操作数的计算。入栈和出栈是栈这种数据结构的基本操作,对于理解栈的工作机制和应用场景具有重要意义。与入栈操作相反,出栈操作遵循的是栈的LIFO原则,即最后进入栈的元素将最先被移除。3. 更新栈的状态:完成入栈操作后,需要更新栈的状态信息,如元素数量、栈顶位置等。4. 更新栈的状态:完成出栈操作后,需要更新栈的状态信息,如元素数量、栈顶位置等。三、入栈和出栈的实现方式。

Dalao_zzl的博客 2856

ABAP代码使用OAuth2.0 Client Credential调用外部API

ABAP-OAuth2.0-调用外部API

m0_74015269的博客 1956

数据结构06:栈及其简单应用

摘要:栈是一种新的数据结构,在我们生活中其实也有很多,只是我们没有关注。栈可以形象为一个 ,秉承着“先进后出,后进先出”的原则。栈相较于之前的链表较为简单,但其应用十分广泛。 一.代码块 1)创建 2)初始化 3)打印 4)压栈 5)出栈 6)压栈出栈测试函数 7)括号匹配(栈的简单应用) 8) 二.图示 三.全部代码 四.运行结果 ...

qq_70132617的博客 678

基于STM32环境温湿度监测系统设计

基于STM32环境温湿度监测系统设计1. 实验目的2. 任务和要求3. proteus仿真图4. 实验代码 1. 实验目的 (1) 掌握使用 KEIL MDK5 进行软件开发的具体流程; (2) 掌握硬件电路的设计方法; (3) 掌握 STM32 微控制器的程序设计及代码编写方法。 2. 任务和要求 (1)在 STM32F103 平台下,通过温度传感器 DS18B20 和湿度传感器 DHT11 实现环境温湿度信息的采集; (2)将温度传感器和湿度传感器所采集的数据在 LCD 液晶屏幕上显示出来,超

唯一的博客 2万+

Python爬虫实战:扒取专利数据库核心信息,我用这招搞定反爬+数据结构化(附完整可运行代码)

这套爬虫方案从「实际需求」出发,解决了专利数据库抓取的核心痛点:反爬突破、数据结构化、标题创作。核心价值不在于代码多复杂,而在于「实用」——我用这套代码半天就抓取了800+条Python爬虫相关专利,比手动效率提升了几十倍。最后想说:爬虫技术的核心是「解决问题」,而不是炫技。专利数据能帮我们快速了解行业技术趋势,尤其是程序员,从专利中扒出的核心逻辑,远比零散的博客文章更系统。希望这篇实战分享能帮到有需要的小伙伴,也欢迎在评论区交流专利爬虫的更多技巧!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2129

数据结构-栈及栈的应用

栈的概述 栈式一种重要的线性结构,属于一种操作受限的线性表 栈(stack) 是限定尽在表尾进行插入或删除操作的线性表 表尾端称为栈顶(top),表头端称为栈底(bottom) 栈的元素先进后出(后进先出),即最先进入栈的元素最后出栈 ...

初始化的博客 5106

Web渗/透/攻/击实战(1)—成功渗/透台湾某净化设备公司官网

写在前面 作为一个防御型白帽黑客​ 你一定要知道黑客的进攻套路 才能有相应的防御措施 声明:只做测试,发现对方的漏洞,并不进行破坏性操作 1、 网站分析 地址:http://www.xxx.com.tw/ 这是一家中国台湾地区的网站,看着满屏的繁体字,就不是很舒服 网站首页包括:关于我们、资料下载、联络方式等等。 这些对我们进行sql注入用处并不大 我们需要的是可以进行参数传入的页面,这样我们就可以在参数里做文章 找一下 有没有新闻列表相关的页面 页...

信息安全领域优质创作者|操作系统领域专家 1808

数据结构:栈 及其应用

栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合 (受限的线性表)。这种数据结构只允许在栈顶进行添加(push)或删除(pop)元素的操作。栈是一种非常基础且重要的数据结构,广泛应用于计算机科学和软件开发中。

pranaa的博客 2516

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数据结构——栈,队列,及其结构特点应用。

今天来学习一下,数据结构中的栈和队列的实现和应用。

qq_63943454的博客 2237

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【数据结构】栈的应用

详细讨论了栈在多个领域中的应用。反之,则依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,直到遇到低于他的优先级的运算符,才入栈。同时,如果函数内部调用了其他函数,系统也会为这些被调用的函数创建新的栈帧,并将当前函数的执行状态压入栈中保存。③遇到界限符,若为左括号直接入栈,若为右括号,则依次弹出栈中的运算符,加入后缀表达式,知道弹出左括号为止。如果扫描到运算符,则从栈中弹出两个操作数(先弹出的为右操作数,后弹出的为左操作数),将这两个操作数作为运算符的输入进行运算,然后将结果压回栈中。

2201_75425839的博客 2865

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数据结构实验1:栈的应用

define MAX_SIZE 100//最大为100个元素,且为全局变量//这里定义的是int型数组,也可以定义其他类型的数组int top;//栈顶,指向末尾元素的起始地址}Stack;可以把栈当作一个数组看待,data数组最多储存100个元素,从0~99,top的范围为-1~98若对结构体定义不清晰,可以参考。

weixin_58628068的博客 1742

使用C语言实现栈数据结构以及栈的应用

栈(stack)是一种特殊的线性表,其操作受限于表的一端,通常称为栈顶。在这个端点,线性表元素可以添加(也称为入栈或压栈)和删除(也称为出栈或退栈),并且这种操作具有后进先出(LIFO)的特性。相对的另一端则被称为栈底。

Monstres的博客 1103

数据结构之栈应用

栈和队列前言一、栈1.栈的应用1.1括号匹配1.2进制转化1.3后缀表达式二、队列1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、栈 先进后出 1.栈的应用 1.1括号匹配 leetcode 20 题 public boolean isValid(String s) { //有效括号时隔

weixin_51601437的博客 296

[数据结构]栈与栈的应用

栈是非常重要的线性数据结构之一,其中一端为栈顶,加入元素和取出元素全部在栈顶端进行,满足FILO(First In Last Out,先进后出)的性质。 考虑这样一个问题: 您需要写一种数据结构,维护一系列数,初始为空。定义其中一端为顶,另一端为底,要求提供三种操作: (1)格式:111 xxx,表示在最顶端处加入一个数xxx;(O(1)O(1)O(1)) (2)格式:222,表示输出最顶端的数...

ix35_的博客 428

Java数据结构之栈的应用

1.概念 栈:一种特殊的线性表,只允许在一端(栈顶)进行数据的插入和删除,另一端成为栈底。 进栈:将数据压入、插入栈内,只能栈顶一端插入。 出栈:将栈顶元素删除。只能从栈顶删除元素。 栈的特性:先进入栈的数据后出栈,后进入栈的数据先出栈。 2.栈的操作 peek( ):查看栈顶元素,返回值为Object类对象。 pop( ):删除栈顶元素,返回值为这个对象(Object)。 push():将数据压...

qq_44267206的博客 387

数据结构栈的实际应用

数据结构栈的实际应用

Jason_boy5的博客 1327

数据结构:栈及其应用

因为栈可以用顺序存储实现也可以用链式存储实现,所以把共性抽取定义出Stack接口 因为栈本身是一种特殊的线性表,所以我们可以用上一篇博客中完成的ArrayList来实现我们的ArrayStack 20.有效的括号 思路分析.........

梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记 1128

【数据结构实验】栈的应用

栈也称为堆栈,是一种先进后出,删除和插入都在栈顶操作的线性表。 特性:先进后出,后进先出。 最先放入栈的最后被拿出来,最后放入栈的内容最先被拿出来。

山风不打咩的博客 2122

【数据结构】栈和队列的应用

💯栈和队列广泛应用于递归,括号匹配,编程语言解析,后缀表达式求值,操作系统中的进程调度,网络传输中的数据包管理等方面。栈的应用栈常用于表达式求值和函数调用,它可以记录函数调用的顺序及相关的局部变量和参数等信息。另外,栈还可以用于文本编辑器中的撤销操作,浏览器中的历史记录,操作系统中的系统调用等等。队列的应用队列常用于模拟系统中的事件流程,如操作系统调度任务(先来先服务),打印队列,消息传递等等。在网络传输中,队列可以用于管理数据包的传输。在排队系统中,队列可以用于管理顾客

DAY I 的成长之路 1598
上一篇: 数据结构--哈希表查找
下一篇: 数据结构--冒泡排序和快速插入排序
hernoforgot
博客等级 码龄9年 22粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值