怎样制定一个网站建设方案,那个网站可以兼职做效果图,邮票上的化学史网站开发,网站里添加斗鱼直播的视频怎么做文章目录 题目一、分析1.1表达式预处理1.2中缀表达式转后缀1.3 后缀表达式计算结果 二、答案 题目 一、分析
通过利用栈将中缀表达式转换为后缀表达式#xff0c;在根据后缀表达式计算运算结果。由于包含负数操作数的情况#xff0c;并且操作数位数不固定为1#xff0c;因此… 文章目录 题目一、分析1.1表达式预处理1.2中缀表达式转后缀1.3 后缀表达式计算结果 二、答案 题目 一、分析
通过利用栈将中缀表达式转换为后缀表达式在根据后缀表达式计算运算结果。由于包含负数操作数的情况并且操作数位数不固定为1因此需要对输入的表达式进行预处理将操作数和操作符进行分离并且将大括号和中括号统一为小括号。
1.1表达式预处理
/// summary
/// 预处理表达式
/// /summary
/// param namedata中缀表达式/param
/// returns表达式/returns
std::vectorstd::string pretreat(const std::string data)
{std::string value data;//-处理括号for (int i 0; i value.size(); i){if (value[i] [ || value[i] {) value[i] (;if (value[i] ] || value[i] }) value[i] );}//-处理负数,并将运算符与运算数拆分开value ( value ); int index -1;std::vectorstd::string content;for (int i 0; i value.size(); i){//-负数操作数的情况if (value[i] - (i - 1) 0 value[i - 1] ( (i 1) value.size() value[i 1] 0 value[i 1] 9){index i;continue;}//-非负数操作数else if (value[i] 0 value[i] 9 index -1){index i;}if ((value[i] 0 || value[i] 9) index ! -1){content.push_back(value.substr(index, i - index));index -1;}if ((value[i] 0 || value[i] 9) index -1){content.push_back(value.substr(i, 1));}}return content;
}1.2中缀表达式转后缀
1.2.1 对于中缀表达式AB*(C-D)-E/F转后后缀表达式时栈中数据变化情况如下。
1.2.2 栈内和栈外操作符的优先级如下。
std::mapstd::string, int isp { {#,0}, {(,1}, {*,5}, {/,5}, {,3}, {-,3}, {),6} };//-栈内操作符的优先级
std::mapstd::string, int icp { {#,0}, {(,6}, {*,4}, {/,4}, {,2}, {-,2}, {),1} };//-栈外操作符的优先级1.2.3 代码逻辑伪代码如下可根据此变化设计代码逻辑。
步扫描项项类型动作栈变化输出0“#”进栈#1A操作数#A2操作符isp[“#”] icp[“”],进栈#A3B操作数#AB4*操作符isp[“”] icp[“*”],进栈#*AB5(操作符isp[“*”] icp[“(”],进栈#*(AB6C操作数#*(ABC7-操作符isp[“(”] icp[“-”],进栈#*(-ABC8D操作数#*(-ABCD9)操作符isp[“-”] icp[“)”],退栈#*(ABCD-”(“ “)”,退栈#*ABCD-10-操作符isp[“*”] icp[“-”],退栈#ABCD-*isp[“”] icp[“-”],退栈#ABCD-*isp[“#”] icp[“-”],进栈#-ABCD-*11E操作数#-ABCD-*E12/操作符isp[“-”] icp[“/”],进栈#-/ABCD-*E13F操作数#-/ABCD-*EF14#操作符isp[“/”] icp[“#”],退栈#-ABCD-*EF/操作符isp[“-”] icp[“#”],退栈#ABCD-*EF/-结束
/// summary
/// 判断是否是操作数
/// /summary
/// param namevalue/param
/// returns/returns
bool isDigit(std::string value)
{if (value.empty())return false;return value.back() 0 value.back() 9;
}/// summary
/// 将中缀表达式转换为后缀表达式
/// /summary
/// param namedata中缀表达式/param
/// returns后缀表达式/returns
std::vectorstd::string postfix(std::vectorstd::string content)
{//-定义栈内操作符和栈外操作符的优先级std::mapstd::string, int isp { {#,0}, {(,1}, {*,5}, {/,5}, {,3}, {-,3}, {),6} };//-栈内操作符的优先级std::mapstd::string, int icp { {#,0}, {(,6}, {*,4}, {/,4}, {,2}, {-,2}, {),1} };//-栈外操作符的优先级content.push_back(#);int index 0;std::vectorstd::string expression;std::string item1 #, item2, item3;std::stackstd::string stack;stack.push(item1);item1 content[index];index;while (!stack.empty() item1 ! #){if (isDigit(item1)){expression.push_back(item1);item1 content[index];index;}else{item2 stack.top();if (isp[item2] icp[item1]){stack.push(item1);item1 content[index];index;}else if (isp[item2] icp[item1]){expression.push_back(stack.top());item3 stack.top();stack.pop();}else{std::string item stack.top();stack.pop();if (item (){item1 content[index];index;}}}}return expression;
}1.3 后缀表达式计算结果
1.3.1 计算后缀表达式ABCD-*EF/-栈中元素变化情况逻辑如下。
步扫描项项类型动作栈中内容1栈置空空2A操作数进栈A3B操作数进栈AB4C操作数进栈ABC5D操作数进栈ABCD6-操作符D、C退栈计算C-D结果R1进栈ABR17*操作符R1、B退栈计算B*R1结果R2进栈BR28操作符R2、B退栈计算AR2结果R3进栈R39E操作数进栈R3E10F操作数进栈R3EF11/操作符F、E退栈计算E/F结果R4进栈R3R412-操作符R4、R3退栈。计算R3-R4结果R5进栈R5
/// summary
/// 根据后缀表达式计算结果
/// /summary
/// param nameexpression/param
/// returns/returns
float calculator(std::vectorstd::string expression)
{std::stackfloat values;for (int i 0; i expression.size(); i){std::string value expression[i];if (isDigit(value)){values.push(std::atoi(value.c_str()));}else{float value1 values.top(); values.pop();float value2 values.top(); values.pop();switch (value[0]){case : values.push(value2 value1); break;case -: values.push(value2 - value1); break;case *: values.push(value2 * value1); break;case /: values.push(value2 / value1); break;default:break;}}}return values.top();
}二、答案
#include iostream
#include stack
#include string
#include vector
#include map/// summary
/// 判断是否是操作数
/// /summary
/// param namevalue/param
/// returns/returns
bool isDigit(std::string value)
{if (value.empty())return false;return value.back() 0 value.back() 9;
}/// summary
/// 将中缀表达式转换为后缀表达式
/// /summary
/// param namedata中缀表达式/param
/// returns后缀表达式/returns
std::vectorstd::string postfix(std::vectorstd::string content)
{//-定义栈内操作符和栈外操作符的优先级std::mapstd::string, int isp { {#,0}, {(,1}, {*,5}, {/,5}, {,3}, {-,3}, {),6} };//-栈内操作符的优先级std::mapstd::string, int icp { {#,0}, {(,6}, {*,4}, {/,4}, {,2}, {-,2}, {),1} };//-栈外操作符的优先级content.push_back(#);int index 0;std::vectorstd::string expression;std::string item1 #, item2, item3;std::stackstd::string stack;stack.push(item1);item1 content[index];index;while (!stack.empty() item1 ! #){if (isDigit(item1)){expression.push_back(item1);item1 content[index];index;}else{item2 stack.top();if (isp[item2] icp[item1]){stack.push(item1);item1 content[index];index;}else if (isp[item2] icp[item1]){expression.push_back(stack.top());item3 stack.top();stack.pop();}else{std::string item stack.top();stack.pop();if (item (){item1 content[index];index;}}}}return expression;
}/// summary
/// 预处理表达式
/// /summary
/// param namedata中缀表达式/param
/// returns表达式/returns
std::vectorstd::string pretreat(const std::string data)
{std::string value data;//-处理括号for (int i 0; i value.size(); i){if (value[i] [ || value[i] {) value[i] (;if (value[i] ] || value[i] }) value[i] );}//-处理负数,并将运算符与运算数拆分开value ( value ); int index -1;std::vectorstd::string content;for (int i 0; i value.size(); i){//-负数操作数的情况if (value[i] - (i - 1) 0 value[i - 1] ( (i 1) value.size() value[i 1] 0 value[i 1] 9){index i;continue;}//-非负数操作数else if (value[i] 0 value[i] 9 index -1){index i;}if ((value[i] 0 || value[i] 9) index ! -1){content.push_back(value.substr(index, i - index));index -1;}if ((value[i] 0 || value[i] 9) index -1){content.push_back(value.substr(i, 1));}}return content;
}/// summary
/// 根据后缀表达式计算结果
/// /summary
/// param nameexpression/param
/// returns/returns
float calculator(std::vectorstd::string expression)
{std::stackfloat values;for (int i 0; i expression.size(); i){std::string value expression[i];if (isDigit(value)){values.push(std::atoi(value.c_str()));}else{float value1 values.top(); values.pop();float value2 values.top(); values.pop();switch (value[0]){case : values.push(value2 value1); break;case -: values.push(value2 - value1); break;case *: values.push(value2 * value1); break;case /: values.push(value2 / value1); break;default:break;}}}return values.top();
}int main()
{std::string data;std::cin data;std::vectorstd::string content pretreat(data);std::vectorstd::string expression postfix(content);std::cout calculator(expression);return 0;
}