《算法》第一章——Dijkstra双栈表达式求值
来源:互联网 发布:润知文化传播有限公司 编辑:程序博客网 时间:2024/05/21 09:24
思路:
使用两个栈分别保存运算符和操作数。将表达式从左到右依次送人栈中处理:
- 将操作数压人操作数栈。
- 将运算符压人运算符栈。
- 忽略左括号。
- 若遇到右括号,则弹出一个运算符,并弹出所需的操作数,并将这部分表达式的运算结果求出后压人操作数栈。
- 处理完所有右括号后,操作数栈中的最后一个指就是表达式的值。
代码:
#include<iostream>#include<sstream>#include<string>#include<stack>using namespace std;template<typename T>T strToNum(const string& str){ istringstream istr(str); T num; istr >> num; return num;}int main(void){ string exp; stack<double> vals;//operand stack stack<string> ops;//operator stack while(cin >> exp,!cin.eof())//"ctrl+z" for console EOF { if(cin.bad()) { cerr << "error:IO stream corrupt " << endl; } if(cin.fail()) { cerr << "bad data!try again!" << endl; cin.clear(); cin.sync(); continue; } // cout << exp <<endl; if(string("+") == exp) { ops.push(exp); } else if(string("-") == exp) { ops.push(exp); } else if(string("*") == exp) { ops.push(exp); } else if(string("/") == exp) { ops.push(exp); } else if(string("(") == exp) {} else if(string(")") == exp) { double val = vals.top(); vals.pop(); string op = ops.top(); ops.pop(); if(string("+") == op) { val = vals.top() + val; vals.pop(); } else if(string("-") == op) { val = vals.top() - val; vals.pop(); } else if(string("*") == op) { val = vals.top() * val; vals.pop(); } else if(string("/") == op) { val = vals.top() / val; vals.pop(); } vals.push(val); } else { //method 1: //double operand = strToNum<double>(exp); //method 2: double operand = stod(exp);//cast string to num.c++11 cout << operand <<endl; vals.push(operand); } } cout << "ret-->" <<vals.top(); getchar(); return 0;}
代码只考虑了每个操作符构成的表达式都用括号括起来的情况。
心得体会:
c++的stack适配器的pop函数只是执行出栈操作并不返回栈顶元素。top函数是返回栈顶元素。
题目:
编写一段程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中缀表达式。(这里也只考虑每个操作符构成的表达式都用括号括起来的情况)
思路:
借鉴上面的思路。上面是在操作符和对应操作数出栈后计算出它们的值后再压人操作数栈,这里为了还原表达式所以不需要计算出表达式的值,而是应该将整个表达式(包括左右括号)压人操作数栈。
代码:
#include<iostream>#include<sstream>#include<string>#include<stack>using namespace std;int main(void){ string exp; stack<string> vals;//operand stack stack<string> ops;//operator stack while(cin >> exp,!cin.eof())//"ctrl+z" for console EOF { if(cin.bad()) { cerr << "error:IO stream corrupt " << endl; } if(cin.fail()) { cerr << "bad data!try again!" << endl; cin.clear(); cin.sync(); continue; } // cout << exp <<endl; if(string("+") == exp) { ops.push(exp); } else if(string("-") == exp) { ops.push(exp); } else if(string("*") == exp) { ops.push(exp); } else if(string("/") == exp) { ops.push(exp); } else if(string("(") == exp) {} else if(string(")") == exp) { string val = vals.top(); vals.pop(); string op = ops.top(); ops.pop(); if(string("+") == op) { val = string("(")+vals.top() +string("+")+ val+string(")"); vals.pop(); } else if(string("-") == op) { val = string("(")+vals.top() +string("-")+ val+string(")"); vals.pop(); } else if(string("*") == op) { val = string("(")+vals.top() +string("*")+ val+string(")"); vals.pop(); } else if(string("/") == op) { val = string("(")+vals.top() +string("/")+ val+string(")"); vals.pop(); } vals.push(val); } else { vals.push(exp); } } cout << "ret-->" <<vals.top(); getchar(); return 0;}
参考:http://blog.csdn.net/k346k346/article/details/50927002----C++数值类型与string的相互转换
0 0
- 《算法》第一章——Dijkstra双栈表达式求值
- Dijkstra双栈算术表达式求值算法
- Dijkstra双栈算术表达式求值算法
- 栈的应用——Dijkstra双栈算法表达式求值算法
- Dijkstra的双栈算法表达式求值算法
- Dijkstra的双栈算数表达式求值算法
- Dijkstra的双栈算术表达式的求值算法
- Dijkstra的双栈算术表达式求值算法
- Dijkstra的双栈算术表达式求值算法
- Dijkstra的双栈算术表达式求值算法
- Dijkstra的双栈算术表达式求值算法
- Dijkstra的双栈算法表达式求值算法(1.3.1 P80)
- Dijkstra的双栈算术表达式(未省略括号)求值算法(algs4)
- Dijkstra双栈算数表达式求值算法的过程与分析
- 算法 -- 双栈算术表达式求值算法
- 算术表达式求值(Dijkstra)
- 算法(第四版) Dijkstra 算数表达式求值算法-双栈
- 双栈算术表达式求值算法
- luogu【P1007】独木桥
- 2.1 官方范例学习《hello》
- 突如其来的变化
- jQuery appendTo() 无效(不生效)如何解决
- Activity之task-----by 安仔
- 《算法》第一章——Dijkstra双栈表达式求值
- 第十周项目2---二叉树遍历的递归算法
- lightoj 1066 - Gathering Food
- 实用 .htaccess 用法大全
- NYOJ 218 Dinner
- 自定义View(一)---Paint
- sql语言分类
- 七牛Android SDK 上传功能整理
- 字符编码Unicode和UTF-8