第六章基于栈的矩阵链乘

来源:互联网 发布:网络传真 编辑:程序博客网 时间:2024/06/12 21:43

这个板块的内容是对《算法竞赛入门经典》基础部分的Java实现,因为在书上是用C++实现的。


例如想要计算(A(BC)),则肯定先计算(BC),也就是说在读入这串字符串的时候,只要遇到了右括号,就从栈里顺序弹出两个矩阵进行计算,计算完成之后把新的矩阵压入栈。因为栈刚好满足先进后出的性质,放在这道题里刚好合适。

直接上代码:

package Practice;import java.util.*;//创建一个矩阵类来保存矩阵的行列信息class matrix{private int line;private int col;public matrix(int line, int col) {super();this.line = line;this.col = col;}public int getLine() {return line;}public int getCol() {return col;}}public class Book_141 {public static void main(String args[]) {Scanner scan=new Scanner(System.in);//输入的矩阵个数int n=Integer.parseInt(scan.nextLine());//用一个栈进行按顺序的压入和弹出操作Stack<matrix> stk =new Stack<matrix>();//创建一个数组用来存储这些矩阵的信息matrix []m=new matrix[n];String []str;for(int i=0;i<n;i++) {str=scan.nextLine().split(" ");m[i]=new matrix(Integer.parseInt(str[0]),Integer.parseInt(str[1]));}//输入矩阵链乘表达式String s=scan.nextLine();int len=s.length();int ans=0;boolean flag=true;for(int i=0;i<len;i++) {char ch=s.charAt(i);System.out.println(ch);if(isalp(ch)) {stk.push(m[ch-'A']);System.out.println("压入一个矩阵");}else if(ch==')') {System.out.println("弹出一个矩阵");matrix mtr2=stk.pop();matrix mtr1=stk.pop();int line1=mtr1.getLine();int col1=mtr1.getCol();int line2=mtr2.getLine();int col2=mtr2.getCol();System.out.println(line1+" "+col1+" "+line2+" "+col2);if(col1!=line2) {flag=false;break;}ans+=line1*col1*col2;System.out.println(ans);stk.push(new matrix(line1,col2));}}if(flag)System.out.println(ans);elseSystem.out.println("error");}public static boolean isalp(char ch) {boolean flag=false;if(ch>='A'&&ch<='Z')flag=true;return flag;}}

其实操作什么都很简单,也没有进行其他的处理,因为平时用栈用得比较少,这里记录一下练习。