下面的是一个比较简单的情况,很多情况都没考虑,比如不是数字(如字母等),比如是多位数的运算(如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
分享到:
相关推荐
使用栈结构解析算术表达式,加、减、乘、除、求余,并支持多位数运算
用栈解析算术表达式,并且做到了多位数运算,运算包括加、减、乘、除、求余
java正则实现解析算术表达式 (仅限+-*/和括号)
使用Lex, Yacc开发的算术表达式解析器,以及算术表达式的计算器。压缩文件包括代码,工程文件,文档。
此算术表达式能够在程序运行时根据输入的变量大小和算术表达式动态解析表达式,得到运算结果。支持多项算术运算符和数学函数如下:: + - * / ^ ( ) mod abs, atan, cos, exp, ln, round, sin, sqrt, sqr, ...
用户输入算术表达式后,对其进行解析,经将数字入数字栈,符号入符号,若要入栈的优先级第低于栈顶的元素的符号,则将栈顶符号出栈,经数字栈出两个数字进栈,将所得的结果入数字栈。这样知道算术表达式扫描完,并且...
算术表达式解析 逆波兰 递归 算术表达式解析 逆波兰 递归 算术表达式解析 逆波兰 递归
此算术表达式能够在程序运行时根据输入的变量大小和算术表达式动态解析表达式,得到运算结果。支持多项算术运算符和数学函数如下:: + - * / ^ ( ) mod abs, atan, cos, exp, ln, round, sin, sqrt, sqr, trunc 例如...
作者qddnovo,源码MathStringExpression,objective-c解析算术表达式的框架,开发iOS计算器/Framework of analytical math expressions 简介 为需要开发iOS计算器的开发者提供的一个便捷 计算字符串数学表达式 ...
对算术表达式运算进行解析运算,在程序中只要输入类似:65+5*(78+32)-80/4+17 的表达式就可以得到运算结果;
实现了算术表达式计算的解析,可计算含有括号(),加减乘除+-*/运算
数据结构课程设计——算术表达式求值计算器winform
能计算如下表达式:x=3 y=4 z=x^2+sin(y)
支持浮点运算; 可以解析简单算术表达式; 仅仅支持加减乘除括号运算; 参见README.txt 每一行都是自己写的。
为表达式语法实现预测解析器。 需要为输入表达式构造一个抽象语法树。 以前序排列输入表达式的抽象语法树。 input.txt (like a, b, c, x, y, not like var1, length) (like 5 +10-x...) output.txt incorrect syntax...
基于栈的算术表达式 在计算机科学中,基于栈的算术表达式求解是常见的编程题。这是因为栈数据结构可以帮助我们实现后缀表达式(逆波兰表示法)的解析和计算。 以下是一个简单的Python代码示例,用于解析和计算后缀...
解析算术表达式的时候,准备调用Webkit通过Js来解析的。 但是2.3.3存在Bug,Js调用Java会导致程序崩溃, 所以没办法,最后是用 BeanShell来解析的。 不过,因为需要每个参与计算的数字都是浮点型, 才能正确无误...
NULL 博文链接:https://huangyuanmu.iteye.com/blog/435938
编写一个词法分析器,对于输入的算术表达式,可以获取该字符串中的所有运算数和运算符。 如,输入25.6 + 17*52.9e10 -6*2^ 3 则要求得到输出如下, 25.6 + 17 * 52.9e10 - 6 * 2 ^ 3