后缀表达式(逆波兰表达式),并求值(可求浮点、负数与大于10的数),C++实现
来源:互联网 发布:手机知乎提问没人回答 编辑:程序博客网 时间:2024/05/21 20:30
后缀表达式(逆波兰表达式),并求值
这是一个栈的简单应用。
规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;
若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
支持()、+、-、*、/和%
#include <stdexcept>#include <iostream>#include <vector>#include <string>#include <stack>#include <regex>#include <cmath>using namespace std;//拆分字符vector<string> Split() { vector<string> temp_VecStr; regex reg_dig("[[:digit:].]"); string temp_str, temp_str1, temp_str2, temp_str3; cout << "请输入表达式:" << endl; cin >> temp_str; for (auto i = temp_str.begin(); i != temp_str.end(); ++i) { temp_str2 = *i; if (regex_search(temp_str2, reg_dig)) { temp_str1 += temp_str2; auto p = i; if (++p == temp_str.end()) { temp_VecStr.push_back(temp_str1); temp_str1.clear(); } --p; if (++p != temp_str.end()) { --p; temp_str2 = *(++p); if (!regex_search(temp_str2, reg_dig)) { temp_VecStr.push_back(temp_str1); temp_str1.clear(); } } } else { if (temp_str2 == "+" || temp_str2 == "-" || temp_str2 == "*" || temp_str2 == "/" || temp_str2 == "(" || temp_str2 == "%") { temp_VecStr.push_back(temp_str2); auto p = i; if (++p != temp_str.end()) { --p; temp_str3 = *(++p); if (temp_str3 == "-") { temp_str1 += temp_str3; if (++p != temp_str.end()) { auto p1 = p; temp_str3 = *p1; for (; regex_search(temp_str3, reg_dig) && p1 != temp_str.end(); ++p1, ++i) { temp_str3 = *p1; if (regex_search(temp_str3, reg_dig)) { temp_str1 += temp_str3; } } temp_VecStr.push_back(temp_str1); temp_str1.clear(); if (regex_search(temp_str3, reg_dig)) { ++i; } } } } } else { temp_VecStr.push_back(temp_str2); } } } return temp_VecStr;}//转换为后缀表达式stack<string> Postfix_Expression(vector<string> temp_VecStr) { stack<string> temp_StackSymbol, temp_StackExp, temp_Stack1, temp_Stack2; regex reg_dig("[[:digit:].]+"); string temp_str; for (auto &i : temp_VecStr) { temp_str = i; if (regex_search(temp_str, reg_dig)) { temp_StackExp.push(temp_str); } if (temp_str == "(") { temp_StackSymbol.push(temp_str); } if (temp_str == ")") { while (temp_StackSymbol.top() != "(") { temp_StackExp.push(temp_StackSymbol.top()); temp_StackSymbol.pop(); } temp_StackSymbol.pop(); } if (temp_str == "+" || temp_str == "-") { if (!temp_StackSymbol.empty()) { if (temp_StackSymbol.top() == "+" || temp_StackSymbol.top() == "-" || temp_StackSymbol.top() == "*" || temp_StackSymbol.top() == "/" || temp_StackSymbol.top() == "%") { while (!temp_StackSymbol.empty() && temp_StackSymbol.top() != "(") { temp_StackExp.push(temp_StackSymbol.top()); temp_StackSymbol.pop(); } temp_StackSymbol.push(temp_str); } else { temp_StackSymbol.push(temp_str); } } else { temp_StackSymbol.push(temp_str); } } if (temp_str == "%") { if (!temp_StackSymbol.empty()) { if (temp_StackSymbol.top() == "*" || temp_StackSymbol.top() == "/" || temp_StackSymbol.top() == "%") { while (!temp_StackSymbol.empty() && temp_StackSymbol.top() != "(" && temp_StackSymbol.top() != "+" && temp_StackSymbol.top() != "-") { temp_StackExp.push(temp_StackSymbol.top()); temp_StackSymbol.pop(); } temp_StackSymbol.push(temp_str); } else { temp_StackSymbol.push(temp_str); } } else { temp_StackSymbol.push(temp_str); } } if (temp_str == "*" || temp_str == "/") { if (!temp_StackSymbol.empty()) { if (temp_StackSymbol.top() == "*" || temp_StackSymbol.top() == "/") { while (!temp_StackSymbol.empty() && temp_StackSymbol.top() != "(" && temp_StackSymbol.top() != "+" && temp_StackSymbol.top() != "-") { temp_StackExp.push(temp_StackSymbol.top()); temp_StackSymbol.pop(); } temp_StackSymbol.push(temp_str); } else { temp_StackSymbol.push(temp_str); } } else { temp_StackSymbol.push(temp_str); } } } while (!temp_StackSymbol.empty()) { temp_StackExp.push(temp_StackSymbol.top()); temp_StackSymbol.pop(); } while (!temp_StackExp.empty()) { temp_Stack1.push(temp_StackExp.top()); temp_Stack2.push(temp_StackExp.top()); temp_StackExp.pop(); } cout << endl << "其后缀表达式为:" << endl << endl; while (!temp_Stack2.empty()) { cout << temp_Stack2.top() << " "; temp_Stack2.pop(); } cout << endl << endl; return temp_Stack1;}//求值void Evaluation(stack<string> temp_StackExp) { auto temp_num1 = 0.0, temp_num2 = 0.0; regex reg_dig("[[:digit:].]+"); stack<double> temp_StackNum; string temp_str; try { while (!temp_StackExp.empty()) { temp_str = temp_StackExp.top(); if (regex_search(temp_str, reg_dig)) { temp_StackNum.push(stod(temp_str)); temp_StackExp.pop(); } if (temp_str == "+") { if (!temp_StackNum.empty()) { temp_num1 = temp_StackNum.top(); temp_StackNum.pop(); temp_num2 = temp_StackNum.top(); temp_StackNum.pop(); temp_StackNum.push(temp_num1 + temp_num2); temp_StackExp.pop(); } else { throw runtime_error("表达式输入错误,请重新输入!"); } } if (temp_str == "-") { if (!temp_StackNum.empty()) { temp_num1 = temp_StackNum.top(); temp_StackNum.pop(); temp_num2 = temp_StackNum.top(); temp_StackNum.pop(); temp_StackNum.push(temp_num2 - temp_num1); temp_StackExp.pop(); } else { throw runtime_error("表达式输入错误,请重新输入!"); } } if (temp_str == "%") { if (!temp_StackNum.empty()) { temp_num1 = temp_StackNum.top(); temp_StackNum.pop(); temp_num2 = temp_StackNum.top(); temp_StackNum.pop(); temp_StackNum.push(fmod(temp_num2, temp_num1)); temp_StackExp.pop(); } else { throw runtime_error("表达式输入错误,请重新输入!"); } } if (temp_str == "*") { if (!temp_StackNum.empty()) { temp_num1 = temp_StackNum.top(); temp_StackNum.pop(); temp_num2 = temp_StackNum.top(); temp_StackNum.pop(); temp_StackNum.push(temp_num1 * temp_num2); temp_StackExp.pop(); } else { throw runtime_error("表达式输入错误,请重新输入!"); } } if (temp_str == "/") { if (!temp_StackNum.empty()) { temp_num1 = temp_StackNum.top(); temp_StackNum.pop(); temp_num2 = temp_StackNum.top(); temp_StackNum.pop(); temp_StackNum.push(temp_num2 / temp_num1); temp_StackExp.pop(); } else { throw runtime_error("表达式输入错误,请重新输入!"); } } } } catch (runtime_error &err) { cout << err.what() << endl; return Evaluation(Postfix_Expression(Split())); } cout << "表达式的值为: " << temp_StackNum.top() << endl << endl;}int main() { while (1) { Evaluation(Postfix_Expression(Split())); } return 0;}
1 0
- 后缀表达式(逆波兰表达式),并求值(可求浮点、负数与大于10的数),C++实现
- 后缀表达式(逆波兰式)、中缀表达式的转换与求值
- 逆波兰式(后缀表达式)的表达求值
- 算术表达式转成后缀表达式(逆波兰式)并求值
- 表达数求值(逆波兰表达式)
- 表达式求值(逆波兰式后缀表达式)
- 实现逆波兰表达式(后缀表达式)的运算结果
- 表达式求值(C实现,实现多括号,浮点数)---栈的实现以及运用。
- 栈的应用二--四则运算表达式求值(逆波兰表示:后缀表达式)
- C语言 实现中缀表达式转后缀表达式并求值
- 中缀表达式转换后缀表达式并求值(java实现)
- 中缀表达式转换后缀表达式并求值(java实现)
- 算术表达式转成前缀表达式(波兰表达式)并求值
- 逆波兰表达式求值
- 逆波兰表达式求值
- 逆波兰表达式求值
- 逆波兰表达式求值
- 逆波兰表达式求值
- 基于ThinkPHP3的微信平台开发_1
- Hibernate HQL以及相关方法
- 二叉排序树
- Android中的MediaMetadataRetriever类取得媒体文件信息
- ClipDrawable的使用
- 后缀表达式(逆波兰表达式),并求值(可求浮点、负数与大于10的数),C++实现
- 【css基础】div父元素根据子元素高度自适应高度
- 欢迎使用CSDN-markdown编辑器
- 是什么造就了如此庞大的PHP帝国?
- AppInventor专题:如何实现两个页面之间的跳转
- union的使用
- 50. Pow(x, n) 【M】【62】
- 227. Basic Calculator II
- 计蒜客 11065 Candy