C++ Primer 练习 9.52 题
来源:互联网 发布:权健集团产业矩阵 编辑:程序博客网 时间:2024/05/16 19:10
初来咋到 请多多关照哈
C++primer 9.52的练习,之前因为自己学识不够,在看看题目:
练习 9.52:
使用stack处理括号化的表达式。当你看到一个左括号,将其记录下来。当你在一个左括号之后看到一个右括号,从stack中pop对象,直至遇到左括号,将左括号也一起弹出栈。然后将一个值(括号内的运算结果)push到栈中,表示一个括号化的(子)表达式已经处理完毕,被其运算结果所替代。
这样的题目。。。额 ,当时有点蒙蔽,什么跟什么,因为完全没接触过(所以。逃
不要嫌弃哈,因为我是新手哈,还在学,数据结构把还是
然后老老实实地查了题目 之后知道是所谓的中缀表达式、后缀表达式、前缀表达式。(额 我还是太弱了
之后借鉴 另一个博主地文章,看了大概地代码自己写了一个,欸,怎么说呢,也是跟那个博主一个,依葫芦画瓢把,依自己地逻辑写出来 挺好地。
下面是链接: 键客小E (这样应该不算转载把)
思路都是差不多的! 下面放我的代码 (
代码质量不是很好,可以的话,大家做下参考把。有什么不足的地方麻烦请指教一下 谢谢 ,也可以看上面的前辈写的 这里应该不能@把 哦算了
#include <iostream>#include <string>#include <stack>#include <vector>using namespace std;void calculate(stack<int> &operd, string oper){if (oper == "-"){int val2 = operd.top();operd.pop();int val1 = operd.top();operd.pop();int result = val1 - val2;operd.push(result);}else if (oper == "+"){int val1 = operd.top();operd.pop();int val2 = operd.top();operd.pop();int result = val1 + val2;operd.push(result);}else if (oper == "*"){int val1 = operd.top();operd.pop();int val2 = operd.top();operd.pop();int result = val1 * val2;operd.push(result);}else if (oper == "/"){int val2 = operd.top();operd.pop();int val1 = operd.top();operd.pop();int result = val2 ? (val1 / val2) : val2; //这里除法要特别计算 除数不能为0operd.push(result);}}int priority(string op){int pri;if (op == "(") //( 都小于其他 pri = 0;else if (op == "+" || op == "-")pri = 1;else if (op == "*" || op == "/")pri = 2;return pri;}vector<string> Amend(string s){size_t len = s.size();vector<string> exp;size_t pos = 0;while ((pos = s.find_first_of(" ()/*-+0123456789", pos)) != string::npos){if (s[pos] == '(' || s[pos] == ')' || s[pos] == '+' || s[pos] == '-' || s[pos] == '/' || s[pos] == '*'){exp.push_back(s.substr(pos, 1));//返回字符串pos++;//加1继续找}else if (s[pos] == ' '){pos++;continue;}else{size_t p;exp.push_back (to_string(stoi(s.substr(pos),&p)));pos = p + pos;}}return exp;}int expression(string str){stack<int> oand; //这个压入操作数 栈stack<string> otor; //这个是压入操作符 栈vector<string> exp = Amend(str);//修正size_t len = exp.size(); //修正之后的表达式大小for (size_t ix = 0; ix != len; ++ix){string token = exp[ix]; //循环逐步读取 每个 标记if (token == "+" || token == "/" || token == "-" || token == "*"){if (otor.size() == 0)otor.push(token);else //进到这肯定有操作符{int pri_token = priority(token);//现在的操作符的优先级string stoken = otor.top();int pri_stack = priority(stoken);//在栈的操作符的优先级if (pri_token > pri_stack)otor.push(token);else{while (pri_token <= pri_stack) //当前的操作符小于栈里的操作符{otor.pop();calculate(oand, stoken); if (otor.size() > 0) //如果操作符栈里还有{stoken = otor.top(); //再次读取当前操作符栈里的操作符pri_stack = priority(stoken); //这里计算优先级}elsebreak;}otor.push(token); //压入新的}}}else if (token == "(") //直接压入(otor.push(token);else if (token == ")") // 这里计算圆括号里的表达式{if (otor.top() == "("){otor.pop();break;}else{while (otor.top() != "("){string stor = otor.top();calculate(oand, stor);otor.pop();}otor.pop(); //弹出(}}elseoand.push(stoi(token)); //stoi 直接 转换 字符串 }while (otor.size() != 0) //如果再之后的里面还剩余操作符和操作数{string stor = otor.top();calculate(oand, stor);otor.pop();}return oand.top(); //返回最终值}int main(){string str("(12+12)*2/2-(1+1)*2");cout << expression(str) << endl;for (auto i : Amend(str))cout << i << ' ';cout << endl;return 0;}
阅读全文
0 0
- C++Primer 动态内存练习 12.6题
- C++Primer 练习 12.7
- c++primer练习10.9
- c++primer练习10.11
- c++primer练习10.13
- c++primer练习10.14
- c++primer练习10.15
- c++primer练习10.18
- c++primer 练习11.9
- c++primer练习11.33
- c++Primer 练习2.41
- C++ Primer 练习 9.52 题
- C++Primer中文版中的练习
- C++primer 文本查询练习
- C++Primer练习3.13疑问?
- c primer 8.1练习答案
- C++Primer 练习9.44 解答
- c primer plus13章练习
- WIFI模块使用心得
- 两个菜单页面组成的手机页面滑动加载更多
- 02 uboot的常用命令及用法
- QT:Qt鼠标
- java long类型报错:error: integer number too large
- C++ Primer 练习 9.52 题
- css元素隐藏原理及display:none和visibility:hidden区别
- 基于 GPUImage2 图像合成视频的探索
- Linux/Android——usb触摸屏驱动
- Halcon关于图像的数学运算的几个算子
- 解决Job for docker.service failed because the control process exited with error code. See "systemctl s
- 仙岛求药(openjudge)
- 微信分享自定义注意事项
- 利用Aspose.Cells组件导出excel文件