首页 > 其他分享 >初级数据结构--栈在表达式求值的应用

初级数据结构--栈在表达式求值的应用

时间:2023-06-06 23:33:38浏览次数:31  
标签:p2 p1 -- top expp ator 求值 数据结构 表达式

表达式

一般有三部分组成:操作数、运算符、界限符

我们常见的表达式一般都属于中缀表达式,比如:2*2/(1+1)-4/2+1

后缀表达式

中缀表达式便于人的理解,但不便于计算机的处理。

于是便有了后缀表达式,也成逆波兰表达式。

比如上面表达式手动转为后缀表达式为2 2 * 1 1 + / 4 2 / - 1 +

(提一下不常用的前缀表达式比如桶为上中缀表达式:+ 1 - / 2 4 / + 1 1 * 2 2,右优先)

为保证运算顺序的唯一性,采用“左优先”的原则。

用栈实现后缀表达式计算

  1. 初始化两个栈,一个栈存放运算符,一个栈存放操作数
  2. 从左往右扫描下一个元素,直到扫描所有元素
  3. 扫描到操作数压入操作数栈,扫描到运算符压入操作符栈

实战上代码

伪代码,或者说是一个bug

目前只支持整型正数,且不带括号的表达式运算,明天继续改善

typedef struct Operand
{
	int and[MAX_SIZE];
	int top;
}Operand;
typedef struct Operator
{
	int top;
	char ator[MAX_SIZE];
}Operator;

//初始化两个栈
void Init_Oper(Operand *p1, Operator *p2)
{
	int i = 0;
	for (i = 0; i < MAX_SIZE; i++)
	{
		p1->and[i] = 0;
		p2->ator[i] = 0;
	}
	p1->top = 0;
	p2->top = 0;
}
//计算
int Calculate(char ator,int x,int y)
{
	switch (ator)
	{
	case '+':
		return x + y;
		break;
	case '-':
		return x - y;
		break;
	case '*':
		return x*y;
		break;
	case '/':
		return x / y;
		break;
	default:
		break;
	}
}
void Out(Operand *p1, Operator *p2)
{
	int ret = 0;
	ret = Calculate(p2->ator[p2->top - 1],
		p1->and[p1->top - 2],
		p1->and[p1->top - 1]);
	p1->and[p1->top - 2] = ret;
	p1->and[p1->top - 1] = 0;
	p1->top--;
	p2->ator[p2->top - 1] = 0;
	p2->top--;
}
bool GetAnswer(Operand *p1, Operator *p2, char *expp)
{
	while (*expp||p2->top)
	{
		int n = 0;
		if (*expp == " ")//跳过空格
		{
			expp++;
			continue;
		}
		if (p2->top > p1->top)//表达式格式错误
			return false;
		if (isdigit(*expp))//压入操作数
		{
			while (*expp&&isdigit(*expp))
			{
				n = n * 10 + *expp-'0';//char型数字需要循环记录完整操作数
				expp++;
			}
			p1->and[p1->top] = n;
			p1->top++;
		}
		else if (*expp == '+' || *expp == '-' || *expp == '*' || *expp == '/')//压入操作符 || *expp == '(' || *expp == ')'
		{
			if (0 == p2->top)
			{
				p2->ator[p2->top] = *expp;
				p2->top++;
				expp++;
			}
			else
			{
				if (*expp == '+' || *expp == '-')//下一个运算符为+ - 出栈
				{
					Out(p1, p2);
				}
				else if (*expp == '*' || *expp == '/')
				{
					//+ - 压栈
					if (p2->ator[p2->top - 1] == '+' || p2->ator[p2->top - 1] == '-')
					{
						p2->ator[p2->top] = *expp;
						p2->top++;
						expp++;
					}
					// * / 出栈
					else if (p2->ator[p2->top - 1] == '*' || p2->ator[p2->top - 1] == '/')
					{
						Out(p1, p2);
					}
					else
						return false;
				}
			}
			//expp++;
		}
		else if (!(*expp)&&p2->top)
		{
			Out(p1, p2);
		}
		else
			return false;
	}
	if (1==(p1->top - 1) && !(p2->top - 1))
		return true;
	else
		return false;
}
int main()
{
	Operand oand;
	Operator oator;
	char exp[] = "1+2*3+-4*3-2*2+2";//5
	Init_Oper(&oand, &oator);
	GetAnswer(&oand, &oator, exp);
	printf("%s\n%d\n", exp, oand.and[oand.top-1]);
	system("pause");
	return 0;
}

标签:p2,p1,--,top,expp,ator,求值,数据结构,表达式
From: https://blog.51cto.com/u_16071993/6428709

相关文章

  • 智慧电网数据可视化运维云平台解决方案
    智慧电力概述智慧电力是通过采用先进的大数据、云计算、物联网、边缘计算等技术,实现生产信息与管理信息的智慧,实现人、技术、经营目标和管理方法的集成,是企业管理思想的一个新突破。智慧电厂建设具备智能化、一体化、可观测、可互动、自学习、自寻优等九大能力,可为管理者及时提供......
  • 【如何入门Python】
    (文章目录)人生苦短,我用Python。欢迎大家一起分享,你是如何入门Python的~方向一:你是如何学习/自学Python的?学习/自学Python的步骤如下:了解Python的基础知识:了解Python的语法、变量、数据类型、算术操作、流程控制语句、函数、模块和包等基础知识。学习Python的核......
  • 列表循环-强调v-for循环中key值的注意点
    key的注意事项key的值只能是字符串或数字类型key的值必须具有唯一性(即:key的值不能重复)建议把数据项id属性的值作为key的值(因为id属性的值具有唯一性)使用index的值当作key的值没有任何意义(因为index的值不具有唯一性)建议使用v-for指令时一定要指定key的值(即提升性能、又防止......
  • JVM调休小记
    首先要明白为什么要进行JVM调优?对于高QPS(每秒查询率,一台服务器能够响应的查询请求的次数)的项目来说其将会在堆内存中高度频繁地创建对象,将会触发较为频繁的GC可以使用jstat命令查看GC的情况jstat-gcutilpid1000每隔1秒打印一次GC统计信息首先要找到java进程的pid通过内置的jps命......
  • 诗词
    一向年光有限身,等闲离别易销魂。酒筵歌席莫辞频。满目山河空念远,落花风雨更伤春。不如怜取眼前人。人的生命将在有限的时间中结束,无端的离别也会让人觉得悲痛欲绝。不要因为常常离别而推辞酒宴,应当在有限的人生,对酒当歌,开怀畅饮。到了登临之时,放眼辽阔河山,突然思念远方的亲友;等......
  • 程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
    (编译与链接)前言每当我们运行一段代码时,编译器都会自动的帮我们编译代码并将代码转换为一个二进制可执行文件(.exe),有了这个可执行文件,便可以执行我们写的程序了。那么编译器对代码的编译以及生成可执行程序的过程是怎样的呢?这个问题便是本文章将要探讨的。程序的环境在A......
  • 摆动排序
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ floatarr[20],h; inti,t=0; charc; printf("pleaseputnumbers:\n"); for(i=0;i<10;i++) { scanf("%f%c",&arr[i],&c); if(c=='......
  • 智慧电网数据可视化运维云平台解决方案
    智慧电力概述智慧电力是通过采用先进的大数据、云计算、物联网、边缘计算等技术,实现生产信息与管理信息的智慧,实现人、技术、经营目标和管理方法的集成,是企业管理思想的一个新突破。智慧电厂建设具备智能化、一体化、可观测、可互动、自学习、自寻优等九大能力,可为管理者及时提供过......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树的右视图
    1.简述:给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例1:输入: [1,2,3,null,5,null,4]输出: [1,3,4]示例2:输入: [1,null,3]输出: [1,3]示例3:输入: []输出: []2.代码实现:classSolution{publicList<I......
  • 2018年湖南省对口高考计算机应用类《网络》部分试题分析
    ......