程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> zoj - 1094 - Matrix Chain Multiplication

zoj - 1094 - Matrix Chain Multiplication

編輯:C++入門知識

題意:輸入不超過26個矩陣的行數和列數,接著來一些表達式詢問,求各條表達式需要多少次基本運算。

 ——>>用STL開2個棧,一個用來存“(”,一個用來存儲矩陣,掃描表達式,當碰到矩陣時,放入矩陣棧;當碰到“(”時,放入符號棧;當碰到“)”的時候,從矩陣棧中取(退)2個矩陣相乘並記錄乘法次數和,並將相乘後的矩陣放入矩陣棧,從符號棧中刪除1個“(”,最後輸出結果即可。

[cpp] 
#include <iostream> 
#include <stack> 
 
using namespace std; 
 
struct Matrix     //矩陣類型,包括行數和列數 

    int row;        //行數 
    int col;        //列數 
}; 
 
int main() 

    int n, i;       //n為輸入的矩陣個數 
    Matrix mat[30];     //用來存儲各個單矩陣(最多只有26個,所以開30的空間有了!!!) 
    char c; 
    cin>>n; 
    for(i = 0; i < n; i++) 
    { 
        cin>>c; 
        int index = (int)(c-'A');       //讓矩陣數組的下標0,1,2...就標志著A,B,C... 
        cin>>mat[index].row>>mat[index].col;      //存入對應的行數和列數 
    } 
 
    string s;       //以字符串的形式輸入每行測試數據 
    while(cin>>s) 
    { 
        long long sum = 0;      //基本乘法數之和,初始為0 
        int len = s.length(); 
        stack<char> st_sign;        //該棧用來存儲"(" 
        stack<Matrix> st_node;        //該棧用來存儲"矩陣" 
        int ok = 1;     //ok用來標志是否出現error的現象 
        for(i = 0; i < len; i++)        //掃描各個字符 
            if(s[i] == ')')     //當出現")"時,必有"("與其對應 
            { 
                int right_value = st_node.top().col;      //從棧中取出矩陣數據,右矩陣的列數 
                int mid_value_right = st_node.top().row;      //右矩陣的行數 
                st_node.pop(); 
                int left_value = st_node.top().row;       //從棧中取出矩陣數據,左矩陣的行數 
                int mid_value_left = st_node.top().col;     //左矩陣的列數 
                if(mid_value_left != mid_value_right)       //當 左矩陣的列數 != 右矩陣的行數 時 
                { 
                    ok = 0; 
                    break; 
                } 
                st_node.pop(); 
                st_sign.pop(); 
                sum += left_value * mid_value_left * right_value;       //累加基本乘法次數 
                Matrix newmat; 
                newmat.row = left_value; 
                newmat.col = right_value; 
                st_node.push(newmat);      //新建一個矩陣,行數為左矩陣的行數,列數為右矩陣的列數,進棧 
            } 
            else if(s[i] == '(')        //碰到"("直接放入符號棧即可 
                st_sign.push('('); 
            else        //當掃到字母即矩陣的時候 
            { 
                int new_index = (int)(s[i]-'A');        //轉換下標 
                st_node.push(mat[new_index]);       //將該矩陣放入矩陣棧 
            } 
        if(ok) 
            cout<<sum<<endl; 
        else 
            cout<<"error"<<endl; 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved