uva442 栈

来源:互联网 发布:js获取元素的父节点 编辑:程序博客网 时间:2024/05/22 07:05

题意:给出矩阵规格, 然后给出矩阵算式, 求每个算式的计算量。当矩阵无法相乘时 输出error

思路:1.计算量的计算方式 (A.r, A.c) * (B.r, B.c) 的计算量是 A.r * A.c * B.c()

    2.关键: 用栈在储存矩阵。 遇到 '(' 时读掉, 遇到字母时压栈, 遇到')'时计算栈的顶部两个矩阵, 形成行矩阵压入栈中。

    3.用数组保存读入的矩阵, 26个英文字母 对于1~26.

算法复杂度:还不会算。。。



代码:

/*堆栈*/#include <stack>#include <cstdio>#include <cstring>using namespace std;struct SMatrix {int row;int col;static int count;};int SMatrix::count = 0;bool error;SMatrix mulMatrix(const SMatrix &, const SMatrix &);int main(){SMatrix matrix[26];memset(matrix, 0, sizeof(matrix));//enterint n;scanf("%d%*c", &n);for (int i = 0; i < n; i++) {char ch;scanf("%c", &ch);scanf("%d%d%*c", &matrix[ch-'A'].row, &matrix[ch-'A'].col);}char ch;stack<SMatrix> staMat;error = false;while (scanf("%c", &ch) != EOF) {if (ch == '\n') {if (error) {printf("error\n");}else {printf("%d\n", SMatrix::count);}SMatrix::count = 0;error = false;}if (ch >= 'A' && ch <= 'Z') {staMat.push(matrix[ch-'A']);}if (ch == ')' && staMat.size() > 1) {SMatrix left, right, rslt;right = staMat.top();staMat.pop();left  = staMat.top();staMat.pop();rslt = mulMatrix(left, right);staMat.push(rslt);}}return 0;}SMatrix mulMatrix(const SMatrix &left, const SMatrix &right){if (left.col != right.row) {error = true;return left;}else {SMatrix::count += left.row * left.col * right.col;}SMatrix rslt;rslt.row = left.row;rslt.col = right.col;return rslt;}


原创粉丝点击