第六章基于栈的矩阵链乘
来源:互联网 发布:网络传真 编辑:程序博客网 时间: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;}}
其实操作什么都很简单,也没有进行其他的处理,因为平时用栈用得比较少,这里记录一下练习。
阅读全文
0 0
- 第六章基于栈的矩阵链乘
- 栈的应用-矩阵链乘uva442
- 基于Opencv的 矩阵点乘
- 基于DP的矩阵连乘问题
- 矩阵链乘的变换
- 基于动态规划的矩阵连乘最优方法
- 基于最小二乘的矩阵分解问题
- 开心的mdd-矩阵链乘
- 矩阵的链乘 (动态规划)
- 矩阵的连乘
- UVa442 矩阵链乘 栈 stack
- UVa 442 栈 矩阵链乘
- 最优矩阵链乘
- NYoj536 矩阵链乘
- uva442-矩阵链乘
- 矩阵链乘
- 矩阵链乘--uva10003
- 矩阵链乘
- 使用tideways绘制php callgraph(profiling)
- oracle_16进制与10进制转换
- Java定时器
- 假装是一个成功的布局——1、配置
- oracle 使用with insert插入数据的问题
- 第六章基于栈的矩阵链乘
- Android横竖屏切换小结(重建、非重建Activity)
- 新用户如何获得阿里云优惠怎么才能省钱-写给阿里云新手
- ExpressRoute 概述
- Docker安装
- 智能指针(二)之auto_ptr
- Java多线程编程——Lock的使用与定时器Timer
- arm Linux平台下FFmpeg的移植
- 添加多个setTag/getTag的方法