题解 | #括号内多个矩阵,实现,欢迎大佬指点#
矩阵乘法计算量估算
https://www.nowcoder.com/practice/15e41630514445719a942e004edc0a5b
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int len = in.nextInt();
//存储矩阵数据
Map<Integer,Matrix> map = new HashMap<>();
/**
*'A'-'Z' 为65-90
*/
for(int i = 65;i< 65+len;i++){
int x = in.nextInt();
int y = in.nextInt();
Matrix matrix = new Matrix(x,y);
map.put(i,matrix);
}
//运算法则
String str = in.next();
/**
* 栈,存储字符和'(',碰到')'就出栈,直到第一次遇到'(',循环结束
* 将计算结果重新入栈,并放入Map集合中
*/
Stack<Character> stack = new Stack<>();
int result = 0;
//遍历运算法则
for(int i = 0;i<str.length();i++){
//入栈
if(('A'<=str.charAt(i)&&str.charAt(i)<='Z')||'('==str.charAt(i)){
stack.add(str.charAt(i));
}
//出栈
if(')'==str.charAt(i)){
List<Matrix> list = new ArrayList<>();
Character pop = null;
while (stack.peek()!='('){
pop = stack.pop();
Matrix matrix = map.get((int) pop);
list.add(0,matrix);
}
//弹出'('
stack.pop();
//计算结果,将最新结果重新放入map,入栈
result = deal(result,list,map,stack,pop);
}
}
System.out.println(result);
}
}
private static Integer deal(int result, List<Matrix> list,Map<Integer,Matrix> map,Stack<Character> stack,Character pop) {
int x = 0; int y =0;
//先取出第一个
Matrix matrix = list.get(0);
for(int i =1;i<list.size();i++){
Matrix matrixY = list.get(i);
x = matrix.getX();
y = matrixY.getY();
result += x*matrix.getY()*y;
//重新给matrix赋值方便下次计算
matrix.setX(x);
matrix.setY(y);
}
//最新值重新放入map,入栈
map.put((int)pop,matrix);
stack.add(pop);
return result;
}
public static class Matrix{
private Integer x;
private Integer y;
private Matrix(){
}
private Matrix(Integer x,Integer y){
this.x= x;
this.y= y;
}
public Integer getX() {
return x;
}
public Integer getY() {
return y;
}
public void setX(Integer x) {
this.x = x;
}
public void setY(Integer y) {
this.y = y;
}
}
}
