栈的应用实例---中缀表达式求值_中缀表达式实例-程序员宅基地

技术标签: 表达式求值  中缀表达式求值  数据结构  

1.中缀表达式求值实现类

package edu.tcu.soft;

import java.util.Stack;

/**
 * 功能:中缀表达式直接求值
 */
public class NifixExpre {

	// 定义操作数栈和操作符栈
	private Stack<Integer> operateNum = new Stack<Integer>();
	private Stack<Character> operateChara = new Stack<Character>();

	// 表达式处理(表达式:运算符【加、减、乘、除、左括号】 运算对象【正数、负数】)
	int expressionHandler(String expre) {
		char[] ex = expre.toCharArray();
		char item;
		// 顺序获取每一运算对象或者运算符
		for (int i = 0; i < ex.length; i++) {
			item = ex[i];
			// 如果当前字符为(,将运算符压入栈内
			if (item == '(') {
				operateChara.push(item);
			}

			// 如果当前字符为运算符 ) ,将运算符栈的运算符出栈直到遇到第一个(
			if (item == ')') {
				// 将操作符栈里面的元素一直出栈,直到遇到第一个左括号为止
				while (operateChara.peek() != '(') {
					char o = operateChara.pop();// 获取操作符
					Integer second = operateNum.pop();// 获取第二个运算对象
					Integer first = operateNum.pop();// 获取第一个运算对象
					Integer result = getResult(first, second, o);// 获取运算结果
					operateNum.push(result);// 将运算结果入栈
				}
				if (operateChara.peek() == '(') {
					// 将左括号移出栈
					operateChara.pop();
				}
			}

			if (item != '(' && item != ')') {
				// 如果当前字符为运算符,入运算符栈
				if (item == '+' || item == '-' || item == '*' || item == '/'
						|| item == '#') {
					// 如果操作符栈为空,入栈
					if (operateChara.empty()) {
						operateChara.add(item);
					} else {
						// 根据优先权的大小,判断操作符是否能进栈
						if (isPush(item, operateChara.peek())) {
							operateChara.push(item);
						} else {
							char o = operateChara.pop();// 获取操作符
							Integer second = operateNum.pop();// 获取第二个运算对象
							Integer first = operateNum.pop();// 获取第一个运算对象
							Integer result = getResult(first, second, o);// 获取运算结果
							operateChara.push(item); // 将当前的运算符入栈
							operateNum.push(result);// 将运算结果入栈
						}
					}
				}
				// 如果当前字符为运算对象
				else if (0 <= Integer.parseInt(String.valueOf(item))
						&& Integer.parseInt(String.valueOf(item)) <= 9) {
					operateNum.push(Integer.parseInt(String.valueOf(item)));
				}
				/*else if(0 <= Integer.parseInt(String.valueOf(item))
						&& Integer.parseInt(String.valueOf(item)) <= 9){
				Stack<Integer> stack=new Stack<>();
				int amount=0;
				while(0 <= Integer.parseInt(String.valueOf(ex[i]))
						&& Integer.parseInt(String.valueOf(ex[i])) <= 9){
					Integer sin=Integer.parseInt(String.valueOf(ex[i]));
					stack.push(sin);
					i++;
				}
				for(int j=0;j<stack.size();j++){
					amount=(int) (amount+stack.pop()*Math.pow(10, j));
				}
				System.out.println("amount"+amount);
				operateNum.push(amount);*/
			}
		}
		return operateNum.peek();
	}

	// 判断是否要把操作符移入栈内
	private boolean isPush(char item, Character peek) {
		if (getPriority(item) > getPriority(peek))
			return true;
		return false;
	}

	// 获取操作符的优先权值
	private int getPriority(Character peek) {

		if (peek == '#') {
			return 0;
		}
		if (peek == '(') {
			return 1;
		} 
		if (peek == '+' || peek == '-') {
			return 2;
		}
		if (peek == '*' || peek == '/') {
			return 3;
		}
		else {
			return -1;
		}
	}

	// 计算
	private Integer getResult(Integer first, Integer second, char o) {

		switch (o) {
		case '+':
			return first + second;
		case '-':
			return first - second;
		case '*':
			return first * second;
		case '/':
			return first / second;
		default:
			break;
		}
		return null;
	}
}

2.测试类

package edu.tcu.soft;


public class Test {
  public static void main(String[] args) {

    NifixExpre expre=new NifixExpre();
    System.out.println("中缀表达式求值:"+expre.expressionHandler("#3*(4+2)/2-5#"));
}
}


这个实现方法还不是很完善,只能进行个位数的加减乘除运算,

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/DREAMEER_DD/article/details/53184660

智能推荐

MobileNet V1_another emerging approach is low bit networks-程序员宅基地

文章浏览阅读513次。版权声明:本文为博主原创文章,未经博主允许不得转载论文:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications链接:https://arxiv.org/abs/1704.04861 tensorflow官方链接:https://github.com/tensorflow/mod..._another emerging approach is low bit networks

内网渗透-域渗透的记录_内网 域-程序员宅基地

文章浏览阅读1.1k次。MS14-068漏洞提权(限制条件:打了补丁或者域中有Win2012/2012R2的域控):首先,需要拥有一台域内普通用户(假设为用户A)账户权限,知道此账户的账号密码。然后依次执行如下命令1.Ipconfig /all //查询本机IP段,所在域等;记录所在的域的名字Net group “domain controllers” /domain 查看域控制器所以所在的域全名 WIN-D..._内网 域

谷歌AI和Facebook提出AI模型QuaterNet,改善3D人体姿势预测-程序员宅基地

文章浏览阅读135次。\n预测 3D 人体姿势可能不属于大多数人关注的范畴,但机器人技术、计算机图形学和其他关注运动学的领域(与物体运动有关的力学分支)却可以从能够做到这一点的系统中受益匪浅。此前,由谷歌提出的姿势预测成为应用人工智能(AI)的任务之一,但先前的相关工作遇到了一些障碍:数字关节和骨骼会向不自然的方向拉伸,特别是当关节旋转时。\n\n幸运的是,Facebook的人工智能研究部门,谷歌大脑和苏黎世联邦理工学..._ai模型 人物旋转预测

分享一下在微信里怎么实现预约链接_微信预约链接-程序员宅基地

文章浏览阅读144次。分享一下在微信里怎么实现预约链接_微信预约链接

深度学习文本分类在支付宝投诉文本模型上的应用-程序员宅基地

文章浏览阅读137次。小蚂蚁说:随着深度学习的快速发展,以及在图像、语音领域取得的不错成果,基于深度学习的自然语言处理技术也日益受到人们的关注。计算机是怎么理解人类的语言的呢?传统机器学习的应用,常常是利用上述人工总结的文本特征,但往往会遇到一些问题。比如“猫”和“咪”这两词语的语义很接近(即近义词),但计算机并不能真正的在词语语义层面理解,只是把他们当作..._支付宝文本相关性判定

【JavaSe】常用API篇(五) Math类_java api 加math.前缀调用输出e 的对数值-程序员宅基地

文章浏览阅读815次。JavaSe·常用API篇(五) Math类1. Math类概述java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单2. 基本运算的方法public static double abs(double a) :返回 double 值的绝对值double..._java api 加math.前缀调用输出e 的对数值

随便推点

解决Ubuntu下打开Windows文本文件中文乱码问题_windows txt在ubuntu乱码-程序员宅基地

文章浏览阅读832次。Ubuntu默认使用gedit UTF-8编码方式打开txt文本文件,而Windows中文文本使用GBK2312编码,因此会出现中文乱码问题。解决方案如下:1. 使用图形界面修改gedit默认编码方式在终端输入dconf-editor(命令无效则根据提示安装,即dconf-tools),逐渐展开org/gnome/gedit/preferences/encodings,在auto-dete_windows txt在ubuntu乱码

蓝桥杯2019年省赛A组第九题——糖果(状压dp)_[蓝桥杯 2019 省 a] 糖果-程序员宅基地

文章浏览阅读692次。题目描述样例思路对于糖果的种类k,每种糖果存在选或者不被选的情况,因此可以将其理解为二进制数例如,当k为5的时候,00001就可以表示1,2,3,4号糖果没被选,5号糖果被选,再如,10100就表示1号和3号糖果被选择了,那么如何实现这种二进制表示状态呢?这就是今天的主角:状态压缩,即利用二进制来表示集合中元素的各种状态,首先我们需要了解状态压缩涉及到的位运算:·~:按位取反运算符,如~10=01·&:按位与运算符,其口诀是:同一为一,其余为零,例如:10011&_[蓝桥杯 2019 省 a] 糖果

slowfast模型浅析-程序员宅基地

文章浏览阅读1w次,点赞7次,收藏43次。slowfast模型浅析业务场景SlowFast模型业务场景背景非常固定动作持续时间短.快SlowFast模型使用双流卷积输入,一个慢通道,一个快通道,分别提取空域信息以及时域信息。关键点:Slow Pathway:γ\gammaγ是采样步长,即将原始视频按照该步长取样,一般取16, 即16帧取一张关键帧,TTT是采样次数,即一共采样多少次。所以慢通道的一次输入总帧数为T×γT \times \gammaT×γFast Pathway:α是帧采样倍数,β是通道倍数\alpha是帧_slowfast模型

从零开始用vs code配置java环境(win 10)-程序员宅基地

文章浏览阅读70次。  在官网下载vscode  下载安装open jdk和maven  2.1. 这里之所以用的是open jdk而非sun jdk,是因为通过vs code提示的链接进入的网站是open jdk,因此我不了解sun jdk是否可行。  我下载的是jdk11,具体下哪个看自己需求。  下载下来..._vscod配置java -baijiahao

CentOS yum安装软件时保留安装包及依赖包或者自动下载安装包及相关依赖包_centos 安装软件时下载-程序员宅基地

文章浏览阅读2.2k次。2、使用yum安装软件yum -y install openssh3、升级结束后去cachedir下将所有目录下的rpm文件取出组合在一起即为当前安装软件所需的所有文件二、使用yum downloadonly下载安装包yum -y install --downloadonly --downloaddir=./ openssh其中--downloadonly 只下载不安装--downloaddir 下载安装包的位置..._centos 安装软件时下载

创建React项目全过程(傻瓜式教程)_创建一个react项目-程序员宅基地

文章浏览阅读1.4w次,点赞14次,收藏48次。创建React项目。npm无法识别_创建一个react项目