1. 程式人生 > >第六章基於棧的矩陣鏈乘

第六章基於棧的矩陣鏈乘

這個板塊的內容是對《演算法競賽入門經典》基礎部分的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);
		else
			System.out.println("error");
	}
	
	public static boolean isalp(char ch) {
		boolean flag=false;
		if(ch>='A'&&ch<='Z')
			flag=true;
		return flag;
	}
}

其實操作什麼都很簡單,也沒有進行其他的處理,因為平時用棧用得比較少,這裡記錄一下練習。

相關推薦

基於矩陣

這個板塊的內容是對《演算法競賽入門經典》基礎部分的Java實現,因為在書上是用C++實現的。 例如想要計算(A(BC)),則肯定先計算(BC),也就是說在讀入這串字串的時候,只要遇到了右括號,就從棧裡順序彈出兩個矩陣進行計算,計算完成之後把新的矩陣壓入棧。因為棧剛好滿足先

比特幣--區塊思想誕生的搖籃

成功 指令 tput cas 靈活 nbsp 重要 wrap 節點 一、比特幣項目簡介 特點: 去中心化:沒有任何獨立個體可以對交易進行破壞,任何交易請求都需要大多數參與者的共識 匿名性:賬戶地址是匿名的,無法從交易信息關聯到具體的個體,這也意味著很難進行審計 通脹

- 網絡編程 - 1.簡單的套接字通信/2.加上通信循環/3.bug修復/4.加上接循環/5.模擬ssh遠程執行命令

lin 有一種 啟動服務 請求 syn攻擊 最大 效率問題 connect tin 1.簡單的套接字通信服務端 1 ‘‘‘ 2 服務端 接電話 3 客戶端 打電話 4 1.先啟動服務端 5 2.服務端有兩種套接字 6 1.phone 用來幹接收鏈接的

“全2019”Java:註釋

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第六章:註釋 下一章 “全棧2019”Java第七章:IntelliJ IDEA註釋快捷鍵

機器學習學習筆記 基於貝葉斯的新聞分類

利用貝葉斯分類器進行文字分類 考慮情況 1 對於文字分析,首先我們應該先利用停用詞語料庫對部分大量出現的停用詞進行遮蔽,可以百度直接搜停用詞進行下載 我們對於經常出現的詞,有可能是一個不太重要的詞,比

】 AOP 之 6.3 基於Schema的AOP

6.3  基於Schema的AOP   基於Schema的AOP從Spring2.0之後通過“aop”名稱空間來定義切面、切入點及宣告通知。     在Spring配置檔案中,所以AOP相關定義必須放在<aop:config>標籤下,該標籤下可以有<ao

軟考-架構師--開發方法 基於架構的軟體設計

#版權宣告 主要針對希賽出版的架構師考試教程《系統架構設計師教程(第4版)》,作者“希賽教育軟考學院”。完成相關的讀書筆記以便後期自查,僅供個人學習使用,不得用於任何商業用途。 文章目錄 第六節 基於架構的軟體設計 軟體模板 ABSD 方

資料結構實驗2.實現的各種基本運算

(1)初始化棧s。 (2)判斷棧s是否為空。 (3)依次進棧元素a,b,c,d,e。 (4)判斷棧s是否為空。 (5)輸出出棧序列。 (6)判斷棧s是否為空。 (7)釋放棧。 #include <stdio.h> #include &l

【WPF學習】五十 基於幀的動畫

  除基於屬性的動畫系統外,WPF提供了一種建立基於幀的動畫的方法,這種方法只使用程式碼。需要做的全部工作是響應靜態的CompositionTarge.Rendering事件,觸發該事件是為了給每幀獲取內容。這是一種非常低階的方法,除非使用標準的基於屬性的動畫模型不能滿足需要(例如,構建簡單的側邊滾動遊戲、建

總結

bsp agile 需要 ack backlog 當前 功能 軟件 決定 敏捷流程:第一步:找出完成產品需要做的事情——Product Backlog      第二步:決定當前的沖刺需要解決的事情——Sprint Backlog      第三步:沖刺(Sprint)  

《python編程》——完整的系統程序 筆記

python編程 方法 nic 腳本 遊戲 err 訪問器 訪問 但是 1、小遊戲:找到最大的python文件。過程是:先掃描標準庫目錄,再變成標準庫目錄樹,然後加上模塊搜索路徑,最後掃描整臺機器。 2、再掃描整臺機器時我們註意到會有一些意外的報錯,在整個硬盤上運行腳本的目

構建之法 敏捷流程

小時 所有 管理層 log 匯報 薪水 quest 功能 任務 敏捷是一種很“年輕態”的思路/策略,是以“萬事萬物都在不停地發展變化”為指導去組織軟件工程的需求分析、內部的調和、代碼編寫甚至維護,所以我讀起來會覺得很有共鳴。然而並不是所有的地方都適合讓“敏捷”去闖一闖。 1

構建之法學習心得

效率 用戶 當前 決定 復雜 技術 原則 核心 back 這周我學習了構建之法第六章敏捷流程,本章主要介紹了敏捷流程及其原則,Backlog、Burn-down、Sprint、Scrum方法論。以及什麽時候選擇敏捷的開發方法,什麽時候選擇其他方法。.敏捷開發的原則是盡早並持

C++對象模型——暫時性對象 ()

|| int 求值 運算 const 三種方式 設有 必須 u+ 6.3 暫時性對象 (Temporary Objects) 假設有一個函數,形式例如以下: T operator+(const T &, const T &); 以及

翻譯文章8-11

開始 ace steps feed mod 第四版 top back amp Training a neural network with neuralnet 用神經網絡神經網絡的訓練 The neural network is constructed with an in

python 核心編程 習題

創建 per 列表 一個 join def print 習題 反轉 6-6 創建一個類似 string.strip() 函數 方法一 低效方法 大量復制和生成子串對象 def str_strip(s):   while len(s)>=2:   

一站式學習Wireshark

客戶端和服務器 所在 方式 判斷 時序 har 思路 發現 使用 在某些情況下,丟包可能並不是造成延時的原因。你可能會發現盡管兩臺主機之間通訊速度很慢,但這種慢速並沒有伴隨著TCP重傳或是重復ACK的征兆。在這種情況下,需要使用另一種方式來定位高延時點。 查找高延時點最有效

核心編程第二版習題

算術 幫我 __main__ div index spa end new 字典序 6–1. 字符串.string 模塊中是否有一種字符串方法或者函數可以幫我鑒定一下一個字符串是否是另一個大字符串的一部分? 成員關系操作符in obj in seq 6&nd

:異常機制

() 不同 finall try arr 運行時 運行 ror 則無 第六章:異常機制 異常的定義 異常:在程序運行過程中出現的意外事件,導致程序中斷執行。 異常處理 try...catch 語法:try{ //可能出現異常的代碼}catch(異常類型 異常對象名){

java面向對象

將不 prop isp b- [] 輸入 color 關鍵字 span 一、 異常 1、 什麽是異常? java程序在運行過程中出現的意外情況 2、 java中如何進行異常處理? java中