首页 > 编程知识 正文

中缀后缀前缀表达式是什么,中缀后缀前缀表达式不同

时间:2023-05-03 09:09:49 阅读:263996 作者:1827

中缀表达式 中缀转后缀 中缀转后缀的手算方法:(1)确定中缀表达式中各个运算符的运算顺序(2)选择下一个运算符,按照【左操作数 右操作数 运算符】的方式组合成一个新的操作数(3)如果还有运算符没被处理,就继续(2) A+B*(C-D)-E/F(1)先算C-D,转成后缀就是CD-,把它看作一个新的操作数FirstCal:A+B*FirstCal-E/F(2)再算B*(C-D),即B*FirstCal,转成后缀即BFirstCal*,把FirstCal展开,就是BCD-*(3)依次类推,接下来A(BCD-*)+,然后A(BCD-*)+(EF/)-,于是最终的后缀表达式就是ABCD-*+EF/- 由于运算的次序并不唯一,所以最终的后缀表达式也并部唯一。但是如果要编写中缀转后缀的算法,那么采用“左优先”原则——只要左边的运算符能先计算,就优先计算左边的。采用“左优先”原则生成的后缀表达式,它的运算符的生效次序就是从左到右依次生效的。

当采用后缀表达式进行运算时,栈先弹出的是右操作数,后弹出的是左操作数

中缀转前缀 中缀转前缀的手算方法:(1)确定中缀表达式中各个运算符的运算顺序(2)选择下一个运算符,按照【运算符 左操作数 右操作数】的方式组合成一个新的操作数(3)如果还有运算符没被处理,就继续(2) A+B*(C-D)-E/F(1)先算C-D,转成前缀就是-CD,把它看作一个新的操作数FirstCal:A+B*FirstCal-E/F(2)再算B*(C-D),即B*FirstCal,转成前缀即*BFirstCal,把FirstCal展开,就是*B-CD(3)依次类推,接下来+A(*B-CD),然后-+A(*B-CD)(/EF),于是最终的前缀表达式就是-+A*B-CD/EF采用“右优先”+A-*B-CD/EF 右优先原则:只要右边的运算符能先计算,就优先算右边的。但是如果要编写中缀转前缀的算法,那么采用“右优先”原则——只要右边的运算符能先计算,就优先计算右边的。采用“右优先”原则生成的前缀表达式,它的运算符的生效次序就是从右到左依次生效的。

采用前缀表达式进行计算,先弹出的是左操作数

中缀转后缀——代码 初始化一个栈,用于保存暂时还不能确定顺序的运算符从左到右处理各个元素,直到末尾。可能遇到三种:(1)遇到操作数。直接加入后缀表达式(2)遇到界限符。遇到“(”直接入栈;遇到“)”则依次弹出栈内运算符,直到弹出“(”为止。(3)遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符对于栈来说,栈顶的输出优先级比栈底高,所以,对于优先级较低的操作符,应该放在栈底,优先级较高的操作符应该放在栈顶。 shit代码 #include <iostream>#include <stdlib.h>#include <stdio.h>#include <string>#include <stack>#include <vector>using namespace std;typedef int Priority;Priority IsInStack(char oprMark);Priority IsOutStack(char oprMark);int Pos[20] = { 0 };int main(){string strExpression;cin >> strExpression; //输入待计算的表达式stack<char> stOperator;vector<string> vecPostfix;string strResult = "";int iStart = 0;int iEnd = 0;while (iEnd < strExpression.size()){if (strExpression[iEnd] >= '0' && strExpression[iEnd] <= '9') {++iEnd; //对于操作数,确定操作数的边界if (iEnd >= strExpression.size()) //如果是最后一个操作数则压入堆栈后结束循环{string strOpr = strExpression.substr(iStart, iEnd - iStart);vecPostfix.push_back(strOpr);}}else //对于操作符则把它压入堆栈中,对于任意两个操作符之间的数值则放入数组中{string strOpr = strExpression.substr(iStart, iEnd - iStart); //操作数 vecPostfix.push_back(strOpr); //操作数入栈iStart = iEnd + 1;if (stOperator.empty()) //如果栈是空的,则把操作符入栈{stOperator.push(strExpression[iEnd]);}else{if (IsOutStack(strExpression[iEnd]) > IsInStack(stOperator.top())) //如果栈不是空的,则把操作符与栈顶操作符进行对比{stOperator.push(strExpression[iEnd]); //优先级比栈顶大,则入栈 }else{while (!stOperator.empty() && IsInStack(stOperator.top()) >= IsOutStack(strExpression[iEnd])) //优先级比栈顶小,则弹出操作符直到优先级更小的{if(stOperator.top() != '(' && stOperator.top() != ')') vecPostfix.push_back(string(1, stOperator.top()));stOperator.pop();}stOperator.push(strExpression[iEnd]); //如果栈空了,或者栈顶操作符的优先级比它小则把把这个操作符入栈}}++iEnd;}}while (!stOperator.empty()) //把栈中操作符都放入数组中{vecPostfix.push_back(string(1, stOperator.top()));stOperator.pop();}for (int i = 0; i < vecPostfix.size(); ++i){cout << vecPostfix[i];}return 0;}Priority IsInStack(char oprMark) //栈内符号的优先级{switch (oprMark){case '+':return 2;break;case '-':return 2;break;case '*':return 4;break;case '/':return 4;break;case '(':return 0;break;case ')':return 5;break;}}Priority IsOutStack(char oprMark) //(栈外的)表达式符号的优先级{switch (oprMark){case '+':return 1;break;case '-':return 1;break;case '*':return 3;break;case '/':return 3;break;case '(':return 5;break;case ')':return 0;break;}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。