在一个表达式中,只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,请求出表达式的值。(“/”用整数除法)。
输入格式:
共1 行,为一个算式。 (算式长度<=30 其中所有数据在 0~2^31-1的范围内)。
输出格式:
共一行,为表达式的值。
输入样例:
在这里给出一组输入。例如:
1+(3+2)*(7^2+6*9)/(2)
输出样例:
在这里给出相应的输出。例如:
258
java代码如下
import java.util.Scanner;
import java.util.Stack;
import java.util.Vector;
public class Main {
static boolean tiaoshi=true;
public static void main(String[] args) {
tiaoshi=false;//调试开关,观察结构
Scanner in = new Scanner(System.in);
String input = in.next();
Stack<Object> stack=new Stack<>();
Vector<Object> output=new Vector<>();
for(int i=0;i<input.length();i++){
int type=getType(input.toCharArray()[i]);
if(type>=0){
int num=type;
while (i<input.length()-1&&getType(input.toCharArray()[i+1])>=0){
num*=10;
num+=getType(input.toCharArray()[++i]);
}
output.add(num);
}else if(stack.size()==0||input.toCharArray()[i]=='('){
stack.push(input.toCharArray()[i]);
}else if(type>-5){
if(type>getType((char)stack.peek())){
stack.push(input.toCharArray()[i]);
}else{
while(stack.size()!=0&&type<=getType((char)stack.peek())){
output.add(stack.pop());
}
stack.push(input.toCharArray()[i]);
}
}else if(input.toCharArray()[i]==')'){
while(stack.size()!=0){
char c=(char)stack.pop();
if(c=='(')break;
else output.add(c);
}
}
}
while(stack.size()>0){
output.add(stack.pop());
}
if(tiaoshi)
System.out.println(output);
stack=new Stack<>();
for(int i=0;i<output.size();i++){
if(output.get(i) instanceof Integer){
stack.push(output.get(i));
if(tiaoshi){
printStack(stack);
}
}else{
int b=(int)stack.pop(),a=(int)stack.pop();
int c=0;
switch ((char)output.get(i)) {
case '+':
c=a+b;
break;
case '-':
c=a-b;
break;
case '*':
c=a*b;
break;
case '/':
c=a/b;
break;
case '^':
c=(int)Math.pow(a,b);
break;
}
stack.push(c);
if(tiaoshi){
System.out.println("[操作符]"+output.get(i));
System.out.println("[a]"+a+" [b]"+b+" [c]"+c);
printStack(stack);
}
}
}
if(tiaoshi){
System.out.println("[stack长度]"+stack.size());
printStack(stack);
}
System.out.println(stack.pop());
in.close();
}
static int getType(char c){
if(c=='('||c==')')return -10086;
if(c=='^')return -2;
if(c=='*'||c=='/')return -3;
if(c=='+'||c=='-')return -4;
return c-'0';
}
static void printStack(Stack stack){
String out="[stack]";
for(int i=0;i<stack.size();i++){
out+=stack.peek();
}
//System.out.println(out);
}
}