数据结构--栈的应用

使用栈实现表达式求值 任何一个表达式都是由操作数,运算符,界限符组成的。操作数即是参加运算的数值或者变量,运算符则是加减乘除等组成,为简单起见,这里只实现加减乘除的运算,而常见的界限符则是左右括号和终止符。在运算过程中,要判断两个先后出现的运算符之间的优先顺序。 为了实现算法,设置两个工作栈:用于存储运算符的栈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)的概念,顺序栈与链栈,单调栈专题,共享栈专题,栈的算法应用:递归专题,四则运算表达式专题(前缀表达式、后缀表达式、中缀表达式),逆波兰表达式的题解。 阅读详情

相关推荐

基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----上篇(第123点)

基于STM32F103C8T6的循迹避障小车完整制作过程 由于本人的一个小项目,要做一个基于STM32的循迹避障小车,前后花了约1周的时间,这个过程种也参考了很多大神分享的资料,学到很多的东西。但是资料都比较分散,有些东西也不好找,在这里就想把自己制作小车的一个整体过程记录分享一下,希望能够帮到你。 我自己也算是一个小白,之前有做过 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎...

weixin_43924857的博客 14万+

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

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

m0_57587757的博客 1万+

win10 运行lisflood_8踩过的坑

1、安装cuda及VS2019 https://www.bilibili.com/read/cv7335974/ 2、netcdf.h头文件找不到问题 https://www.cnblogs.com/lyggqm/p/12926974.html https://blog.youkuaiyun.com/u011954296/article/details/54617048 3、编码问题 https://blog.youkuaiyun.com/qq_33485434/article/details/81196843 4、

我的笔记 4115

5.8 案例分析与实现

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

tang7mj的博客 522

火山引擎实时对话AI实战:5分钟搞定WebRTC+大模型+ASR/TTS全链路集成

本文详细介绍了如何利用火山引擎的实时对话AI解决方案,快速集成WebRTC、大模型、ASR和TTS服务,构建低延迟、高保真的实时语音对话应用。通过实战代码示例,从环境准备、音频流管理到全链路串联与性能优化,为开发者提供了一套端到端的集成指南,适用于智能客服、在线教育等互动场景。

weixin_29051245的博客 1129

最优化学习笔记1——关于拟牛顿法推导

从2020年3月份到现在,一年的时间里断断续续自学最优化,结合豆瓣读书、知乎等网站上的推荐,翻阅了以下书和课程: Stephen Boyd和Lieven Vandenberghe的《Convex Optimization》,这本书被公认为学习凸优化的必读经典著作,其中大量的篇幅讲应用,讲理论和算法的篇幅稍少一些。在B网站上有Boyd的视频课程,油管上也有,不过只有英文字幕,如果是零基础接触,直接看Boyd的视频稍显费劲,B站上也有凌青老师以《Convex Optimization》为教材的讲解,推荐作为入

xiaofei473的博客 1768

入栈和出栈的基本操作

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

Dalao_zzl的博客 2856

2D Nesting Defining a CSV File of Part Data

若。

qq_36560674的博客 1849

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

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

qq_70132617的博客 678

WhatsApp注册流程逆向分析:从协议解析到风控对抗实战

移动应用安全分析的核心在于理解客户端与服务端的交互协议与验证机制。通过逆向工程,可以深入剖析应用的数据加密、传输与身份验证原理,这对于构建安全模型、进行自动化测试和风控策略研究具有重要技术价值。在即时通讯、金融支付等高安全要求场景中,掌握应用注册流程的底层实现是评估其安全性的关键。本文聚焦于使用动态分析工具如Frida进行Hook和流量抓包,结合设备指纹识别与模拟器检测技术,详细解析了大型应用的注册风控体系,为安全研究人员和开发者提供了从环境搭建到实战对抗的完整方法。

weixin_33935636的博客 317

UDS诊断服务基础详解之二19服务

本文主要介绍UDS统一诊断服务的19 01服务,包含状态位和故障码的解析以及19 01服务的具体说明

车载网络小D的博客 1万+

数据结构-栈及栈的应用

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

初始化的博客 5106

FH8626V100之开发环境搭建

FH8626V100是富瀚微出的一款带摄像头的方案,开发工具在Linux 上进行。版本 Ubuntu 20.04 64位。

xue_nuo的博客 1万+

数据结构:栈 及其应用

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

pranaa的博客 2516

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

qq_63943454的博客 2237

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【数据结构】栈的应用

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

2201_75425839的博客 2865

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据结构实验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、付费专栏及课程。

余额充值