题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1082
---------------------------------------------------------------------
题目大意:给你各矩阵的行和列,然后给你个表达式,让你判断能否进行矩阵相乘的运算,若能,并输出乘法的运算次数
----------------------------------------------------------------------
思路:用栈来实现对式子的顺序处理
----------------------------------------------------------------------
此题收获
1.学会运用了C++自带的stack库函数
2.在写代码时,可以先把思路,接下来要写部分写出来,先把此处的算法弄清楚,接下来的就是翻译的事情了
3.对于式子的运算顺序的处理,栈是一个很好的思想
3.对于式子的运算顺序的处理,栈是一个很好的思想
------------------------------------------------------------------------
C++中stack相关函数的应用
1.声明一个stack
stack<int> s1;
stack<string> s2;
2.stack中的操作
stack<int> s;
s.push(x) 无返回值,将元素x压栈
s.pop(); 退栈,无返回值
s.top(); 取栈顶元素,返回栈顶元素 ,只取不弹
s.empty(); 判断栈是否为空,如果是空,返回1,否则返回0
s.size(); 返回栈中元素的个数
在栈中没有提供清空操作的函数,但是可以间接地实现清空栈,
while (!s.empty())
{
s.pop();
}
stack<int> s;
s.push(x) 无返回值,将元素x压栈
s.pop(); 退栈,无返回值
s.top(); 取栈顶元素,返回栈顶元素 ,只取不弹
s.empty(); 判断栈是否为空,如果是空,返回1,否则返回0
s.size(); 返回栈中元素的个数
在栈中没有提供清空操作的函数,但是可以间接地实现清空栈,
while (!s.empty())
{
s.pop();
}
上AC代码:
#include<iostream> #include<stack> #include<cstring> #define MAX1 1000 #define MAX2 5000 using namespace std; #include<stdlib.h> class Matrix { public: int rows; int col; }; void calculate(char*,Matrix*,char*); int main() { //正确存储数据 int T; cin >> T; Matrix M[MAX1]; char name[MAX1]; int i; for (i = 1; i <= T; i++) { cin >> name[i]; cin >> M[i].rows; cin >> M[i].col; } //存储数据检查 //计算式的输入和处理 char str[MAX2]; while ((cin >> str)) { if (1 == strlen(str)) { cout << "0\n"; } else { calculate(str, M,name); } } //system("pause"); } //计算主体函数的编写:设置栈,将str中的一个个变形下,压入栈中,并且遇到“)”则进行弹栈操作 //弹栈时,再建一个栈把它逆过来输出,注意,由于栈是Matrix型的,遇到“(”,则用left.row=-1 //代替进栈 void calculate(char*str, Matrix*M,char*name) { //定义栈,并且将str的相关压入栈中 stack<Matrix> S1; stack<Matrix> trans_S2; Matrix M1, M2; Matrix left; //这个表示左括号 left.rows = -1; left.col = -1; int sum=0; int i; int j; for (i = 0; str[i]; i++) { if (str[i] == '(') { S1.push(left); } else if (str[i] == ')') { //开始具体处理,先弹S1的栈,知道弹到“(”为止,弹进trans_S2里 Matrix temp = S1.top(); S1.pop(); while (temp.rows != -1) { trans_S2.push(temp); temp = S1.top(); S1.pop(); } //将trans_S2栈里的元素一个个弹出,若满足矩阵相乘原则,则将其相乘,若不满足 //直接结束 M1 = trans_S2.top(); trans_S2.pop(); while (!trans_S2.empty()) { M2 = trans_S2.top(); trans_S2.pop(); if (M1.col == M2.rows) { sum += M1.col*M1.rows*M2.col;//计算次数 M1.col = M2.col; } else { cout << "error\n"; return; } } //相乘结束后,将结果再压入S1的栈中 S1.push(M1); } else { //如果是字符的话,直接找到对应的位置,压入栈中 for (j = 1; name[j] != str[i]; j++); S1.push(M[j]); } } //最后再判断在S1栈里面的元素情况,可能是只剩一个,弹栈输出即可,可能是剩了好几个,要再 //计算才行 if (S1.size() == 1) { M1 = S1.top(); S1.pop(); cout << sum << endl; return; } else { while (!S1.empty()) { trans_S2.push(S1.top()); S1.pop(); } M1 = trans_S2.top(); trans_S2.pop(); while (!trans_S2.empty()) { M2 = trans_S2.top(); trans_S2.pop(); if (M1.col == M2.rows) { sum += M1.col*M1.rows*M2.col;//计算次数 M1.col = M2.col; } else { cout << "error\n"; return; } } cout << sum<< endl; } }