一,问题描述
1,用逆波兰表达式法去计算算术表达式的值。其中,有效运算符为+,-,*,/。每个操作数可以是整数或者另一个表达式
2,例如:
3,解题思路:
先定义一个栈用来存放数据的,然后对字符串数组进行从左到后进行扫描,如果遇到的是字符串符号(+,-,*,/),则从栈中取出两个整数进行符号操作的,再把结果放回栈中,如果遇到的是字符串整数,直接存放在栈中去,一直到字符串数组全部扫描完。
二,AC了的程序(用java实现的)
import java.util.*;
public class Test2{
public int evalRPN(String []tokens)
{
if(tokens==null||tokens.length==0)
{
return -1;
}
Stack<Integer> stack=new Stack<Integer>(); //这个stack用来存放整数的,不存放符号+,-,*,/
for(int i=0;i<tokens.length;i++)
{
if(tokens[i].equals("+")||tokens[i].equals("-")||tokens[i].equals("*")||tokens[i].equals("/"))
{
int data1=stack.pop();//出栈第一个整数,栈的规则是先进后出的,因此对于
int data2=stack.pop();//出栈第二个整数
//System.out.println("data1="+data1);
//System.out.println("data2="+data2);
int data3;
if(tokens[i].equals("+"))
{
data3=data1+data2;
stack.push(data3);
}else if(tokens[i].equals("-"))
{
data3=data2-data1;
stack.push(data3);
}else if(tokens[i].equals("*"))
{
data3=data1*data2;
stack.push(data3);
}else if(tokens[i].equals("/"))
{
data3=data2/data1;
stack.push(data3);
}
}
else
{
int data=Integer.parseInt(tokens[i]); //把字符串转化为整数
stack.push(data); //当碰到整数的话,就是直接入栈。
}
}
int data4=stack.pop();
return data4;
}
public static void main(String []args)
{
Test2 test=new Test2();
//String []tokens={"2","1","+","3","*"};
String []tokens={"4","13","5","/","+"};
int result=test.evalRPN(tokens);
System.out.println("result="+result);
}
}
运行结果
result=6