`

解析算术表达式

阅读更多

下面的是一个比较简单的情况,很多情况都没考虑,比如不是数字(如字母等),比如是多位数的运算(如23+456)等。

 

public class SuffixCompute 
{
	private static String suffix = "";
	
	public static void main(String[] args)
	{
		Stack<String> stack = new Stack<String>();
		
		String str = "(2+3)*4-6/3";
		
		System.out.println("The expession to compute is : " + str);
		
		Compute(str, stack);
	}
	
	public static void Compute(String expression, Stack<String> stack)
	{
		char ch;
		int num1 = 0;
		int num2 = 0;
		int result = 0;
		String str = "";
		
		str = changeToSuffix(expression, stack);
		
		for(int i=0; i<str.length(); i++)
		{
			ch = str.charAt(i);
			
			if(ch > '0' && ch < '9')
				stack.push(String.valueOf(ch));
			else
			{
				num1 = Integer.parseInt(stack.pop());
				num2 = Integer.parseInt(stack.pop());
				
				switch(ch)
				{
					case '+':
						result = num2 + num1;
						break;
						
					case '-':
						result = num2 - num1;
						break;
						
					case '*':
						result = num2 * num1;
						break;
						
					case '/':
						result = num2 / num1;
						break;
				}
				
				stack.push(String.valueOf(result));
			}
		}
		
		result = Integer.parseInt(stack.pop());
		
		System.out. println("The result is : " + result);
	}
	
	public static String changeToSuffix(String str, Stack<String> stack)
	{
		char ch;
		
		for(int i=0; i<str.length(); i++)
		{
			ch = str.charAt(i);
			
			switch(ch)
			{
				case '+':
				case '-':
					getOper(ch, 1, stack);
					break;
					
				case '*':
				case '/':
					getOper(ch, 2, stack);
					break;
					
				case '(':
					stack.push(String.valueOf(ch));
					break;
					
				case ')':
					getParen(ch, stack);
					break;
					
				default:
					suffix += ch;
					break;
			}
		}
		
		while(!stack.isEmpty())
		{
			suffix += stack.pop();
		}
		
		System.out.println("The suffix is :" + suffix);
		
		return suffix;
	}
	
	public static void getOper(char ch, int flag1, Stack<String> stack)
	{
		char oper;
		int flag2;
		
		while(!stack.isEmpty())
		{
			oper = stack.pop().charAt(0);
			
			if(oper == '(')
			{
				stack.push(String.valueOf(oper));
				break;
			}
			else
			{
				if(oper == '+' || oper == '-')
					flag2 = 1;
				else
					flag2= 2;
				
				if(flag2 < flag1)
				{
					stack.push(String.valueOf(oper));
					break;
				}
				else
				{
					suffix += oper;
				}
			}
		}
		stack.push(String.valueOf(ch));
	}
	
	public static void getParen(char ch, Stack<String> stack)
	{
		char temp;
		
		while(!stack.isEmpty())
		{
			temp = stack.pop().charAt(0);
			
			if(temp == '(')
				break;
			else
				suffix += temp;
		}
	}
}

 

 

输出如下:

The expession to compute is : (2+3)*4-6/3
The suffix is :23+4*63/-
The result is : 18

 

1
0
分享到:
评论

相关推荐

    栈结构解析算术表达式

    使用栈结构解析算术表达式,加、减、乘、除、求余,并支持多位数运算

    用栈解析算术表达式

    用栈解析算术表达式,并且做到了多位数运算,运算包括加、减、乘、除、求余

    java正则实现解析算术表达式 (仅限+-*/和括号)

    java正则实现解析算术表达式 (仅限+-*/和括号)

    算术表达式转换成前缀表达式

    在给定的代码中,作者使用了一个 parse 函数来实现解析算术表达式的过程。 7. 二叉树的前序遍历(Pre-Order Traversal) 二叉树的前序遍历是一种树遍历算法,其中先访问当前节点,然后访问左子树和右子树。在给定...

    数据结构算术表达式

    1. **解析算术表达式**: 解析是将字符串形式的算术表达式转换成抽象语法树(AST)的过程。AST是一种树形结构,其中每个节点代表表达式的一部分,如操作数、运算符或括号内的子表达式。解析可以采用不同的方法,如...

    java解释算术表达式

    在这个场景中,我们关注的是一个用Java编写的专门用于解析算术表达式的解释器。Java是一种广泛使用的面向对象的编程语言,以其跨平台性和强大的库支持而著名。下面我们将深入探讨Java解释算术表达式这一主题。 首先...

    设计一个程序,演示用算符优先法对算术表达式求值的过程

    算符优先法是一种用于解析算术表达式的有效方法,特别是对于处理四则运算表达式时尤为有用。通过本项目,我们将深入探讨如何使用算符优先法来实现一个简单的程序,该程序能够接受标准输入的算术表达式并输出其计算...

    二叉树表示的算术表达式

    在数据结构课程设计中,"二叉树表示的算术表达式"是一个常见的主题,它涉及到计算机科学的基础概念,特别是二叉树、数据结构以及如何用它们来解析和操作算术表达式。在这个项目中,我们将深入探讨这些知识点,并了解...

    使用Lex, Yacc开发的算术表达式解析器,以及算术表达式的计算器

    在IT领域,开发一个能解析和计算算术表达式的程序是一项基础且重要的任务。这个程序通常涉及词法分析(Lex)和语法分析(Yacc)这两个编译原理的关键步骤。让我们详细了解一下这些概念以及如何利用它们来实现一个...

    数据结构算术表达式的求解大学毕业论文.doc

    本文是关于数据结构算术表达式的求解的大学毕业论文,主要介绍了算术表达式的解析和求解过程,使用了数据结构课程设计题的思路来分析和解决问题。下面是本文的知识点摘要: 一、算术表达式的定义和类型 算术表达式...

    算符优先文法处理判断算术表达式的正确性

    算符优先文法是编译原理中的一种解析技术,它用于处理和解析算术表达式,以确保其结构正确并能被准确地计算。本文将详细介绍算符优先文法在判断算术表达式正确性中的应用,并结合提供的源代码、说明文档和输入输出...

    递归下降语法分析器 算术表达式 C语言

    总之,这个项目实现了一个用C语言编写的递归下降语法分析器,专门用于解析算术表达式。通过这种方式,我们可以将源代码中的复杂表达式转化为易于处理的数据结构,为后续的编译或解释过程奠定基础。这种解析方法不仅...

    算术表达式递归下降分析程序设计

    本项目的目标是设计一个C++源程序,用于解析给定的算术表达式。根据描述,提供的算术表达式文法如下: ```markdown E -&gt; E + T | T T -&gt; T * F | F F -&gt; (E) | i ``` 这个文法定义了一个简单的算术表达式结构,...

    数据结构课程设计-算术表达式的求解.doc

    * 能够正确地解析算术表达式,包括加法、减法、乘法、除法等运算符。 * 能够正确地计算算术表达式的结果。 * 能够处理算术表达式中的错误,包括语法错误和语义错误。 2. 选题目的及意义 本课程设计的目的是为了...

    算术表达式求值计算器winform

    3. **运算符优先级**: 在解析算术表达式时,需要遵循运算符的优先级规则,例如乘法和除法优先于加法和减法。为了正确计算,我们需要对运算符的优先级进行管理。 4. **后缀表达式(逆波兰表示法)**: 后缀表达式是一...

    LL1文法、SLR文法实现算术表达式分析

    总结,LL1和SLR文法在编译器设计中扮演着核心角色,它们帮助我们理解和解析算术表达式。在VC++环境下实现这些文法,需要理解文法的构造、解析表的生成以及词法和语法分析器的编写,这都是编译原理中的基础实践。通过...

    面向对象课程设计(计算算术表达式)

    本项目旨在实现一个能够解析并计算算术表达式的软件。具体目标如下: 1. **内容**:该程序应能正确计算含有括号的算术表达式,通过逐步解析并计算括号内的表达式,最终得出整个表达式的值。 - 举例说明:对于...

    算术表达式解析模板代码 逆波兰

    在解析算术表达式时,通常采用两种主要方法:中缀表达式转换为后缀表达式(逆波兰表示法),以及直接解析后缀表达式。前者涉及将中缀表达式通过操作符优先级规则转换,后者则利用栈来依次处理后缀表达式中的元素。 ...

    算术表达式的LR翻译器

    在编译原理中,LR翻译器是一种用于解析和翻译编程语言中的语法结构的工具,特别是对于处理算术表达式非常有效。本项目是基于C++实现的“算术表达式的LR翻译器”,它包含了LR分析树和分析表的生成过程,这些都是...

Global site tag (gtag.js) - Google Analytics