题目
给一个字符串,包含(),整数,"±*"三个符号.如(+ 5 4); 请将给定的字符串求值,每个表达式中,有一个操作符,两个以上的操作数,操作数可能是整数也可能是一个表达式.
思路
并没有什么好说的,简单模拟即可,这题麻烦就在输入输出. Scanner类无法单字符读取,所以在此将其处理为一条带空格的字符串,使用sc.useDelimiter("\n");
代码
import java. util. *;
public class Main {
public static void main ( String[ ] args)
{
Stack< String> s = new Stack < > ( ) ;
Scanner sc = new Scanner ( System. in) ;
sc. useDelimiter ( "\n" ) ;
String question = sc. nextLine ( ) ;
System. out. println ( question) ;
ArrayList< String> a = new ArrayList < > ( ) ;
int index = 0 ;
while ( index< question. length ( ) )
{
s. push ( Character. toString ( question. charAt ( index) ) ) ;
System. out. println ( s) ;
if ( s. peek ( ) . equals ( ")" ) )
{
s. pop ( ) ;
while ( ! s. peek ( ) . equals ( "(" ) )
{
a. add ( s. pop ( ) ) ;
}
s. pop ( ) ;
System. out. println ( a) ;
s. push ( Calculate ( a) ) ;
a. clear ( ) ;
}
index++ ;
}
System. out. println ( s. peek ( ) ) ;
}
private static String Calculate ( ArrayList< String> a) {
Character operator = ' ' ;
ArrayList< Integer> o = new ArrayList < Integer> ( ) ;
for ( int i= a. size ( ) - 1 ; i>= 0 ; i-- )
{
if ( a. get ( i) . equals ( "+" ) || a. get ( i) . equals ( "-" ) || a. get ( i) . equals ( "*" ) )
{
operator= a. get ( i) . charAt ( 0 ) ;
}
else if ( a. get ( i) . equals ( " " ) )
{
continue ;
}
else if ( Integer. parseInt ( a. get ( i) ) >= 0 && Integer. parseInt ( a. get ( i) ) <= 9 && a. get ( i+ 1 ) . equals ( " " ) )
{
int x= Integer. parseInt ( a. get ( i) ) ;
int j= i- 1 ;
while ( j> 0 && ! a. get ( j) . equals ( " " ) )
{
x= x* 10 + Integer. parseInt ( a. get ( j) ) ;
j-- ;
}
o. add ( x) ;
System. out. println ( o) ;
i= j+ 1 ;
}
}
int ans= 0 ;
switch ( operator)
{
case '+' :
for ( int i: o)
ans+= i;
break ;
case '-' :
ans= o. get ( 0 ) ;
for ( int i= 1 ; i< o. size ( ) ; i++ )
ans-= o. get ( i) ;
break ;
case '*' :
ans= o. get ( 0 ) ;
for ( int i= 1 ; i< o. size ( ) ; i++ )
ans*= o. get ( i) ;
break ;
}
return Integer. toString ( ans) ;
}
}