中缀表达式转前缀和后缀表达式

中缀转前缀

  1. #ifndef POSTFIX_TO_NIFIXEXPRESS_H
  2. #define POSTFIX_TO_NIFIXEXPRESS_H
  3. #include<iostream>
  4. #include<string>
  5. #include<stack>
  6. /************************************************************************/
  7. /* 中缀表达式转前缀表达式
  8. 建立一个栈来保存运算符,和一个字符容器存字符及运算符的输出。
  9. 从后向前扫描中缀表达式:
  10. 1、如果遇到的是普通字符那么存入容器中
  11. 2、如果遇到的是‘)’,存入容器中
  12. 3、如果遇到的是运算符(大于等于栈顶的优先级就入栈,否则弹栈)
  13. 如果当前栈为空或者当前运算符的优先级大于等于栈顶元素的优先级,那么入栈。
  14. 如果栈顶元素是‘)’,还是入栈。
  15. 如果当前运算符的优先级小于栈顶元素的优先级,那么弹栈存入容器中,一直到栈顶元素为‘)’或
  16. 者当前运算符的优先级大于或者等于栈顶元素的优先级。将当前运算符入栈。
  17. 4、如果遇到‘(’,那么弹栈存入容器一直遇到到‘)’,将‘)’弹出
  18. 5、返向输出容器中的字符
  19. */
  20. /************************************************************************/
  21. std::string nifixExpressToPrefix(std::string &nifixExp){
  22. std::stack<char> operStack;
  23. std::string prefixExp;
  24. for(auto iter=nifixExp.rbegin(); iter!=nifixExp.rend(); iter++){
  25. if(*iter!=‘*‘&&*iter!=‘\\‘&&*iter!=‘+‘&&*iter!=‘-‘&&*iter!=‘(‘&&*iter!=‘)‘){
  26. prefixExp.push_back(*iter);
  27. }else if(*iter==‘)‘){
  28. operStack.push(*iter);
  29. }else if(*iter==‘(‘){
  30. while(operStack.top()!=‘)‘){
  31. prefixExp.push_back(operStack.top());
  32. operStack.pop();
  33. }
  34. operStack.pop();
  35. }else if(*iter==‘*‘||*iter==‘\\‘){
  36. operStack.push(*iter);
  37. }else if(*iter==‘+‘||*iter==‘-‘){
  38. if(operStack.empty()){
  39. operStack.push(*iter);
  40. }else{
  41. if(operStack.top()==‘-‘||operStack.top()==‘+‘||operStack.top()==‘)‘){
  42. operStack.push(*iter);
  43. }else{
  44. while(!operStack.empty()){
  45. if(operStack.top()==‘)‘||operStack.top()==‘+‘||operStack.top()==‘-‘){
  46. break;
  47. }
  48. prefixExp.push_back(operStack.top());
  49. operStack.pop();
  50. }
  51. operStack.push(*iter);
  52. }
  53. }
  54. }
  55. }
  56. while(!operStack.empty()){
  57. prefixExp.push_back(operStack.top());
  58. operStack.pop();
  59. }
  60. std::string strResult;
  61. for(auto iter=prefixExp.rbegin(); iter!=prefixExp.rend(); iter++){
  62. strResult.push_back(*iter);
  63. }
  64. return strResult;
  65. }
  66. #endif

中缀转后缀

  1. #ifndef NIFIX_TO_POSTFIX_H
  2. #define NIFIX_TO_POSTFIX_H
  3. #include<iostream>
  4. #include<string>
  5. #include<stack>
  6. /************************************************************************/
  7. /* 中缀表达式转后缀表达式
  8. 建立一个运算符的栈,从左向右开始扫描中缀表达式。
  9. 1、如果是字符则直接输出
  10. 2、如果是‘(’,那么入栈。
  11. 3、如果是运算符:(大于栈顶的优先级就入栈,否则弹栈)
  12. 如果栈顶的元素是‘(’或者当前运算符的优先级比栈顶元素优先级高,那么入栈。
  13. 如果当前的运算符的优先级比栈顶的优先级低或者相等,那么就弹栈输出,一直输出到栈顶的运算符
  14. 的优先级比当前运算符优先级低或者栈为空,以及栈顶为‘(‘。将当前的运算符压入栈。
  15. 4、如果是‘)’,那么一直弹栈输出,一直弹到第一次看到‘(’
  16. */
  17. /************************************************************************/
  18. std::string nifixToPostfix(const std::string &nifixExp){
  19. std::stack<char> operaStack;
  20. std::string postfixStr;
  21. for(auto iter=nifixExp.begin(); iter!=nifixExp.end(); iter++){
  22. if(*iter!=‘*‘&&*iter!=‘\\‘&&*iter!=‘+‘&&*iter!=‘-‘&&*iter!=‘(‘&&*iter!=‘)‘){
  23. postfixStr.push_back(*iter);
  24. }else if(*iter==‘(‘){
  25. operaStack.push(‘(‘);
  26. }else if(*iter==‘)‘){
  27. while(operaStack.top()!=‘(‘){
  28. postfixStr.push_back(operaStack.top());
  29. operaStack.pop();
  30. }
  31. operaStack.pop();
  32. }else if(*iter==‘*‘||*iter==‘\\‘){
  33. if(operaStack.empty()){
  34. operaStack.push(*iter);
  35. }else{
  36. if(operaStack.top()==‘+‘||operaStack.top()==‘-‘||operaStack.top()==‘(‘){
  37. operaStack.push(*iter);
  38. }else{
  39. while(!operaStack.empty()){
  40. if(operaStack.top()==‘(‘||operaStack.top()==‘+‘||operaStack.top()==‘-‘){
  41. break;
  42. }
  43. postfixStr.push_back(operaStack.top());
  44. operaStack.pop();
  45. }
  46. operaStack.push(*iter);
  47. }
  48. }
  49. }else if(*iter==‘+‘||*iter==‘-‘){
  50. if(operaStack.empty()){
  51. operaStack.push(*iter);
  52. }else{
  53. while(!operaStack.empty()){
  54. if(operaStack.top()==‘(‘){
  55. break;
  56. }
  57. postfixStr.push_back(operaStack.top());
  58. operaStack.pop();
  59. }
  60. operaStack.push(*iter);
  61. }
  62. }
  63. }
  64. while(!operaStack.empty()){
  65. postfixStr.push_back(operaStack.top());
  66. operaStack.pop();
  67. }
  68. return postfixStr;
  69. }
  70. #endif

来自为知笔记(Wiz)

时间: 2024-08-07 20:58:35

中缀表达式转前缀和后缀表达式的相关文章

中缀、前缀、后缀表达式的转换

中缀表达式:a+b*c-(d+e) 第一步:按照运算符的优先级对所有的运算单位加括号:式子变成了:((a+(b*c))-(d+e)) 第二步:转换前缀与后缀表达式 前缀(波兰式):把运算符号移动到对应的括号前面 则变成了:-( +(a *(bc)) +(de)) 把括号去掉:-+a*bc+de 前缀式子出现 后缀(逆波兰式):把运算符号移动到对应的括号后面 则变成了:((a(bc)* )+ (de)+ )- 把括号去掉:abc*+de+- 后缀式子出现

中缀表达式与前、后缀表达式转化简单的技巧[转]

35,15,+,80,70,-,*,20,/ //后缀表达方式 (((35+15)*(80-70))/20)=25 //中缀表达方式 /,*,+,35,15,-,80,70, 20 //前缀表达方式 人的思维方式很容易固定~~!正如习惯拉10进制.就对2,3,4,8,16等进制不知所措一样~~! 人们习惯的运算方式是中缀表达式.而碰到前缀,后缀方式..迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式) 我这里教你一种也许你老师都没跟你讲的简单转换方式 一个中缀式到其他式子的转换方法 这里我

中缀表达式转换为前、后缀表达式转化简单的技巧[转]

原文来源 https://www.cnblogs.com/Hslim/p/5008460.html 这里我给出一个中缀表达式 1 a+b*c-(d+e)    //中缀表达 第一步:按照运算符的优先级对所有的运算单位加括号 式子变成:((a+(b*c))-(d+e))第二步:转换前缀与后缀表达式        前缀:把运算符号移动到对应的括号前面                则变成:-( +(a *(bc)) +(de)) //这里移动时                把括号去掉:-+a*bc

运用栈把算术表达式+,-,*,/,%(中缀表达式)转换成后缀表达式并且计算出值

原理: 1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束, 2.如果是符号,放进栈, 3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式 4.计算后缀表达式,判断是数字还是符号.直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“\0” 代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有) 1 #include <stdio.h> 2 #include &l

中缀、前缀和后缀表达式

我们学习的算法中的表达式有中缀.前缀和后缀之分,到底有什么区别呢? 中缀(INFIX) 中缀表达式(infix expression)可以是单个变量,或两个变量以及中间的操作符. AA + B(A + B) + (C – D) 前缀(PREFIX) 前缀表达式(prefix expression)可以是单个变量,一个操作符,后面跟两个操作数,每个前缀表达式包括一个操作符和两个操作数. A+ A B+ + A B – C D 后缀(POSTFIX) 后缀表达式(postfix expression

中缀表达式检测并转换后缀表达式,计算后缀表达式的结果

实现代码如下 #include <iostream> #include <stack> #include <ctype.h> using namespace std; //这里的数字只能是一位 //扫描表达式是否合法,合法返回0,否则返回非0 int Scanner(const char *str) { stack<char*> s; if(str==NULL) { return -1; } char *p=(char*)str; while(*p!='\0

表达式求值(后缀表达式求值)

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束.这个表达式里只包

逆波兰表达式的实现(也叫后缀表达式)

本文主要偏重实现如何将字符串表达式转换为逆波兰表达式. 关于其讲解参考我转载的一篇博文:http://www.cnblogs.com/vpoet/p/4659546.html 先说说优先级: ()    +-     */%(从左到右递增) 下面先简单再梳理一下: 1.建立两个栈,一个为N(数据栈),一个为OP(运算符栈) 2.将字符串从左向右遍历,把数据压入数据栈,把运算符压入运算符的栈   关于运算符压栈的规则:⑴ 如果OP为空直接将运算符压入栈 ⑵ 如果不为空,则比较待入栈元素和栈顶元素的

【转】前缀、中缀、后缀表达式

它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计