问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

中缀表达式转化为后缀表达式求值的思路

发布网友 发布时间:2022-04-25 22:42

我来回答

1个回答

热心网友 时间:2022-06-18 07:41

算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。 5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 6.最终将栈中的元素依次出栈,输出。 例如 a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出: 后缀表达式:a 堆栈:空 遇到+:堆栈:空,所以+入栈 后缀表达式:a 堆栈:+ 遇到b: 直接输出 后缀表达式:ab 堆栈:+ 遇到*:堆栈非空,但是+的优先级不高于*,所以*入栈 后缀表达式: ab 堆栈:*+ 遇到c:直接输出 后缀表达式:abc 堆栈:*+ 遇到+:堆栈非空,堆栈中的*优先级大于+,输出并出栈,堆栈中的+优先级等于+,输出并出栈,然后再将该运算符(+)入栈 后缀表达式:abc*+ 堆栈:+ 遇到(:直接入栈 后缀表达式:abc*+ 堆栈:(+ 遇到d:输出 后缀表达式:abc*+d 堆栈:(+ 遇到*:堆栈非空,堆栈中的(优先级小于*,所以不出栈 后缀表达式:abc*+d 堆栈:*(+ 遇到e:输出 后缀表达式:abc*+de 堆栈:*(+ 遇到+:由于*的优先级大于+,输出并出栈,但是(的优先级低于+,所以将*出栈,+入栈 后缀表达式:abc*+de* 堆栈:+(+ 遇到f:输出 后缀表达式:abc*+de*f 堆栈:+(+ 遇到):执行出栈并输出元素,直到弹出左括号,所括号不输出 后缀表达式:abc*+de*f+ 堆栈:+ 遇到*:堆栈为空,入栈 后缀表达式: abc*+de*f+ 堆栈:*+ 遇到g:输出 后缀表达式:abc*+de*f+g 堆栈:*+ 遇到中缀表达式结束:弹出所有的运算符并输出 后缀表达式:abc*+de*f+g*+ 堆栈:空 例程: 这是我自己写的一个简单的中缀表达式求值程序,简单到只能计算10以内的数,支持+-*/()运算符。 复制代码 #include <stack> using namespace std; bool IsOperator(char ch) { char ops[] = "+-*/"; for (int i = 0; i < sizeof(ops) / sizeof(char); i++) { if (ch == ops[i]) return true; } return false; } ////////////////////////////////////////////////////////////////////////// // 比较两个操作符的优先级 int Precedence(char op1, char op2) { if (op1 == '(') { return -1; } if (op1 == '+' || op1 == '-') { if (op2 == '*' || op2 == '/') { return -1; } else { return 0; } } if (op1 == '*' || op1 == '/') { if (op2 == '+' || op2 == '-') { return 1; } else { return 0; } } } ////////////////////////////////////////////////////////////////////////// // 中缀表达式转换成后缀表达式 void inFix2PostFix(char* inFix, char* postFix) { int j = 0, len; char c; stack<char> st; len = strlen(inFix); for (int i = 0; i < len; i++) { c = inFix[i]; if (c == '(') st.push(c); else if (c == ')') { while (st.top() != '(') { postFix[j++] = st.top(); st.pop(); } st.pop(); } else { if (!IsOperator(c)) st.push(c); else { while (st.empty() == false && Precedence(st.top(), c) >= 0) { postFix[j++] = st.top(); st.pop(); } st.push(c); } } } while (st.empty() == false) { postFix[j++] = st.top(); st.pop(); } postFix[j] = 0; } ////////////////////////////////////////////////////////////////////////// // 后缀表达式求值程序 double postFixEval(char* postFix) { stack<char> st; int len = strlen(postFix); char c; for (int i = 0; i < len; i++) { c = postFix[i]; if (IsOperator(c) == false) { st.push(c - '0'); } else { char op1, op2; int val; op1 = st.top(); st.pop(); op2 = st.top(); st.pop(); switch (c) { case '+': val = op1 + op2; break; case '-': val = op2 - op1; break; case '*': val = op1 * op2; break; case '/': val = op2 / op1; break; } st.push(val); } } return st.top(); } int _tmain(int argc, _TCHAR* argv[]) { char inFix[100]; char postFix[100]; double val; while (1) { printf("enter an expression:"); gets_s(inFix); if (strlen(inFix) == 0) continue; printf("\n%s = ", inFix); inFix2PostFix(inFix, postFix); printf("%s = ", postFix); val = postFixEval(postFix); printf("%.3f\n", val); } return 0; }
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
多特后防四大天王是哪些 iPhoe4还原所有设置后变成语音朗读而且滑屏无法正常使用 金鱼在鱼缸里几天能不会死掉? 金鱼放鱼缸多久合适 金鱼放鱼缸的时间 想学会缅甸语请问大神昆明附近有没有好一点的班? 昆明哪里可以学缅甸语?哪里不贵,哪里有优势? 昆明哪里可以学缅甸语啊?想去学几个月。 要出去缅甸出差一段时间,请问下昆明什么地方有好的缅甸语培训?? 叔叔要去缅甸做生意,帮他找间学校学缅甸语,简单的就行了,只有两个月... 昆明学缅甸语哪里学呀??? 想学几个月,再去一次缅甸。 在职幼师,想离职,合同没到期,押金2000也不退,园长不让我走? 马自达昂克赛拉2017款和2019款是一样的吗? 表达式求值 数据结构中缀表示转换为后缀表达式 昂克赛拉现在质量稳定了吗 我在幼儿园签了一年的合同,但我干了五天就不想干了,会付违约金吗,可以辞职吗_百度问一问 中缀表达式转化为后缀表达式 如何自学心理学 2017款马自达3昂克赛拉1.5自动舒适版落地价 会计月报表应该怎么做? 中缀表达式如何转换为前后缀表达式? 如何自学心理学!? 你认为2107款昂克赛拉和2019款哪一款更值得购买? 想自学风水,看了网上,各执己见,议论纷纷,不知真伪,怕误入歧途,请教大虾们,该如何入手? 每月企业必须编制的会计报表包括哪些? pascal 后缀 中缀表达式转换 (用栈 并说明) 17款昂克赛拉电子手刹怎么用?停车往上提一下?启动踩油门自动解吗? 如何在程序中将中缀表达式转换为后缀表达式 会计报表编制需要注意哪些方面 中缀表达式转后缀表达式是什么? 在幼儿园里上班签合同的,如果合同没到期想要辞职的话可以辞职吗? 2017款昂克赛拉1.5l自豪版,动力怎么样 中缀表达式转后缀表达式 马自达的昂克赛拉2017年新款多少钱 在幼儿园做了十年以上的员工合同没有到期如何辞职 中缀表达式怎么转换为后缀表达式 1.5L昂克赛拉这款车怎么样? 幼儿园没签合同能临时辞职吗 17款昂克赛拉1.5自豪,裸车价14万多,跑了75000公里,现在值多少钱? 佛教网名大全微信名字 在幼儿园实习签了学校发的就业协议说是以后要跟踪调查什么的,没有签三方协议,实习期还没满可以离职吗? 昂克赛拉怎么样?值得买吗? 在一家幼儿园上班,签了合同不想做了可以辞职吗 在幼儿园实习签了一个合同是一个工作证明在幼儿园工作2年也没有写违约金这些现在不想做了可以直接辞职吗? 幼儿园合同没有到期,不想干了,押金会返回吗? 合同未到期可以提出辞职吗 合同未到期能辞职吗? 华为p30为什么不能更新鸿蒙系统? SEO自学教程(25) 什么是伪静态 为什么我的手机p30更新不了鸿蒙系统? 为什么华为p30型号ELEL29为什么不能升级鸿蒙系统呀?