【日常学习】【栈】【表达式求值】Uva442 - Matrix Chain Multiplication题解

£神魔★判官ぃ 2022-08-07 02:00 121阅读 0赞

之前一直没有写过栈的典型程序,这里写一个。这个程序完全是我独立写出来的,我还没有看ruka上的标程,或许会有些不同。

题目来源:University of Ulm Local Contest 1996 Uva 442 POJ 2246

简而言之,就是按一定的规则求(A(BC))这样的表达式的值,是典型的表达式求值题目

这次写了伪代码,虽然也不是伪代码,就是一点思路

  1. //伪代码
  2. int main(){
  3. 初始化;读入
  4. //如(A(BC))
  5. 遇到左括号就进栈,先把A2个数据进栈 10 20
  6. 又是左括号,BC都进栈
  7. 这时候遇到右括号,两个栈顶元素出栈 需要四个变量存储a1 a2 b1 b2a2b1必须相等,否则输出error
  8. 计算a1*a2*b2 ans+ 此时BC合并为10 520已被去除)即 a1 b2入栈
  9. 遇到右括号 同理 直到结束
  10. }

这是基本思路 括号实际充当了入站出站的标志

野生代码:

  1. #include<iostream>
  2. #include<stack>
  3. #include<cstdio>
  4. #include<string>//POJ要加string
  5. using namespace std;
  6. struct matrix{//notice!!!
  7. int a,b;
  8. matrix(int a=0,int b=0):a(a),b(b){} //结构体变量a,b赋初值
  9. }m[26];//以结构体为基类型的数组
  10. stack<int> s;
  11. int main(){
  12. int n;
  13. cin>>n;//忘了写这一句 后果是int类型读入了A 于是遇到问题关闭 !!!TUT
  14. char ch;
  15. for (int i=0;i<n;i++){
  16. cin>>ch;
  17. cin>>m[ch-'A'].a>>m[ch-'A'].b;
  18. }
  19. string str;
  20. while (cin>>str){
  21. if (isalpha(str[0])){
  22. cout<<0<<endl;
  23. continue;
  24. }
  25. bool er=false;
  26. int a1,a2,b1,b2,ans=0;//按顺序先入栈
  27. for (int i=1;i<=str.size()-1;i++){//第二遍刚开始少了等号 答案错误
  28. if (str[i]=='(') continue;
  29. else if ((str[i]==')')&&(!s.empty())){
  30. b2=s.top();s.pop();
  31. b1=s.top();s.pop();
  32. a2=s.top();s.pop();
  33. a1=s.top();s.pop();
  34. if (a2!=b1){
  35. cout<<"error"<<endl;
  36. er=true;
  37. break;
  38. }
  39. ans+=a1*a2*b2;
  40. s.push(a1);
  41. s.push(b2);
  42. }
  43. else{
  44. int x=str[i]-'A';
  45. s.push(m[x].a);
  46. s.push(m[x].b);
  47. }
  48. }
  49. (!er)?cout<<ans<<endl:er=false;//防止输出error的情况下还输出ans(=0)
  50. }
  51. return 0;
  52. }

前两天发现的神奇现象,i/o/iostream头文件里包括string,今天又有了新的发现:还是加上string吧,因为不加string的代码在ZOJAC,在POJCE了TUT

基本上,栈的典型应用,结构体的基础,在这里都有了。

——乘彼垝垣,以望复关。不见复关,泣涕涟涟;既见复关,载笑载言。

发表评论

表情:
评论列表 (有 0 条评论,121人围观)

还没有评论,来说两句吧...

相关阅读