1、算法思路

转化为后缀:从左到右遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于等于当前操作符的操作符,当前操作符进栈。
    转化为前缀:从右到左遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于等于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于当前操作符的操作符,当前操作符进栈。--参考该网址
     以上方法需要先定义操作符优先级,当然,可以定义。但是这样会麻烦许多,那么不如用括号来进行进行限定。这样就不需要写判断优先级函数了。

2、中缀表达式转后缀表达式

'(','+','-','*','/'入栈
      ')'输出栈中到'('的元素
      其他字符直接输出
附代码:
void inTopast(char* str)    //中缀到后缀
{int slen = strlen(str); //字符长度int top = -1;   //栈顶top++;for(int i = 0; i < slen; i++)   //正序{char c = str[i];    //提取一字符switch(c)   //比较{//'(','+','-','*','/'入栈//')'输出栈中到'('的元素//其他字符直接输出case '(' :stacks[top++].s = c;break;case ')' :while(stacks[--top].s != '(')cout << stacks[top].s;break;case '+' :stacks[top++].s = c;break;case '-' :stacks[top++].s = c;break;case '*' :stacks[top++].s = c;break;case '/' :stacks[top++].s = c;break;default :cout << c;}}cout << endl;
}

3、中缀表达式转前缀表达式

')','+','-','*','/'入栈
        '('保存栈中到')'的元素
        其他字符直接保存
将保存的字符串逆序输出就是前缀表达式
附代码:
void inToprev(char* str)    //中缀到前缀
{int slen = strlen(str); //字符长度int top = -1;   //栈顶top++;char res[MAX_LENGTH];int num = 0;for(int i = slen -1; i >= 0; i--)   //逆序{char c = str[i];    //提取一字符switch(c)   //比较{//')','+','-','*','/'入栈//'('保存栈中到')'的元素//其他字符直接保存case ')' :stacks[top++].s = c;break;case '(' :while(stacks[--top].s != ')')res[num++] = stacks[top].s;break;case '+' :stacks[top++].s = c;break;case '-' :stacks[top++].s = c;break;case '*' :stacks[top++].s = c;break;case '/' :stacks[top++].s = c;break;default :res[num++] = c;}}//将保存的字符串逆序输出就是前缀表达式for(int i = num - 1; i >= 0; i--)cout << res[i];cout << endl;
}

4、源程序

#include <iostream>
#include <cstring>using namespace std;int const MAX_LENGTH = 100;
typedef struct
{char s;
}Stacks;   //栈结构定义Stacks stacks[MAX_LENGTH];  //栈void inTopast(char* str)    //中缀到后缀
{int slen = strlen(str); //字符长度int top = -1;   //栈顶top++;for(int i = 0; i < slen; i++)   //正序{char c = str[i];    //提取一字符switch(c)   //比较{//'(','+','-','*','/'入栈//')'输出栈中到'('的元素//其他字符直接输出case '(' :stacks[top++].s = c;break;case ')' :while(stacks[--top].s != '(')cout << stacks[top].s;break;case '+' :stacks[top++].s = c;break;case '-' :stacks[top++].s = c;break;case '*' :stacks[top++].s = c;break;case '/' :stacks[top++].s = c;break;default :cout << c;}}cout << endl;
}void inToprev(char* str)    //中缀到前缀
{int slen = strlen(str); //字符长度int top = -1;   //栈顶top++;char res[MAX_LENGTH];int num = 0;for(int i = slen -1; i >= 0; i--)   //逆序{char c = str[i];    //提取一字符switch(c)   //比较{//')','+','-','*','/'入栈//'('保存栈中到')'的元素//其他字符直接保存case ')' :stacks[top++].s = c;break;case '(' :while(stacks[--top].s != ')')res[num++] = stacks[top].s;break;case '+' :stacks[top++].s = c;break;case '-' :stacks[top++].s = c;break;case '*' :stacks[top++].s = c;break;case '/' :stacks[top++].s = c;break;default :res[num++] = c;}}//将保存的字符串逆序输出就是前缀表达式for(int i = num - 1; i >= 0; i--)cout << res[i];cout << endl;
}int main()
{//测试数据char str1[] = "((a+b)*c)";char str2[] = "((a*(b+c))*d)";inTopast(str1);inTopast(str2);inToprev(str1);inToprev(str2);return 0;
}

中缀表达式到前缀表达式和后缀表达式相关推荐

  1. 前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码

    1. 中缀.前缀和后缀表达式 1.1 中缀表达式 首先,中缀表达式的这个"缀"指运算符在两个操作数的位置.中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * ...

  2. 中缀转后缀表达式,带括号的后缀表达式综合计算器,Java栈数据结构实现

    文章目录 中缀表达式转后缀表达式思路 逆波兰表达式计算思路 代码实现 中缀表达式转后缀表达式思路 1.初始化两个栈:运算符栈s1和储存中间结果的栈s2 2.从左至右扫描中缀表达式 3.遇到操作数时,将 ...

  3. 数据结构:前缀,中缀,后缀表达式(逆波兰表达式)

    前缀表达式(波兰表达式) 前缀表达式的运算符位于操作数之前. 比如 (1+2)*3-4  对应的前缀表达式就是: - * + 1 2 3 4 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,就 ...

  4. 前缀、中缀、后缀表达式(转载)

    关键字:概念, 前缀表达式, 前缀记法, 中缀表达式, 中缀记法, 波兰式, 后缀表达式, 后缀记法, 逆波兰式 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运 ...

  5. 天勤数据结构:前缀、中缀、后缀表达式的转换与计算

    第三章 栈和队列 1. 输出队列问题 2. 表达式的转换 - 手工转换 2.1 中缀表达式 转 前缀表达式 2.2 中缀表达式 转 后缀表达式 2.3 后缀表达式 转 中缀表达式 2.4 后缀表达式 ...

  6. 中缀表达式转换为前缀及后缀表达式并求值【摘】

    它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例: (3 + 4) ...

  7. 前缀、中缀、后缀表达式

    关键字:概念, 前缀表达式, 前缀记法, 中缀表达式, 中缀记法, 波兰式, 后缀表达式, 后缀记法, 逆波兰式 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运 ...

  8. 前缀,中缀,后缀表达式

    前缀表达式 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前. 例如: ( 3 + 4 ) × 5 − 6 (3+4)×5-6 (3+4)×5−6 对应的前缀表达式就是 - × + 3 4 5 ...

  9. 数据结构与算法——前缀、中缀、后缀表达式

    目录 一.前缀表达式(波兰表达式) 二.中缀表达式 三.后缀表达式(逆波兰表达式) 1.逆波兰计算器 四.中缀转后缀 1.具体步骤 2.代码实现 一.前缀表达式(波兰表达式) 前缀表达式的运算符位于操 ...

  10. 中缀表达式/后缀表达式/前缀表达式

    1:什么是中缀表达式,前缀表达式,后缀表达式? 正如我们常常潜意识认为我们所说的数字都是十进制,对于数字的其他进制感觉不正确一样,其实只是我们不熟悉而已,其他进制其实也不过就是一种对数据的表达方式而已 ...

最新文章

  1. 【Spring】ioc的常用注解
  2. 浙大计算机科学基础题型,浙江大学878计算机学科专业基础(含数据结构)考研复习经验...
  3. 在不重装XP系统,增加系统盘剩余空间
  4. C++ 备忘录 ( 持续更新中... )
  5. Alien 快速安装 Rippled 节点【Ubuntu】
  6. 电脑仙人掌机器人作文_【中考一等作文2篇】致敬奋斗的时光父爱如根般深沉...
  7. 谷歌技术三宝之BigTable
  8. Linux云服务器安装JDK详细步骤
  9. gridview databind 会导致页面刷新马_Innodb批量页面刷盘情况下的quot;两次写quot;
  10. php unexpected t_object_operator,php - PHP中的“Unexpected T_OBJECT_OPERATOR”错误
  11. [转载]学习java30条基本的概念
  12. ready to study design pattern
  13. caffe:制作自己的数据集train.txt和val.txt,生成lmdb文件
  14. 深度解密换脸应用Deepfake
  15. 计算机会计学ufo报表,计算机会计学 第四章 报表子系统.pdf
  16. Sketch的下载与安装
  17. 【转】英语词汇学习渐进
  18. Excel-散点图(相关性及数据分布)分析
  19. 终于懂得孤独是躲不开的单行道
  20. OneZero第三周第一次站立会议(2016.4.4)

热门文章

  1. 浅谈CC攻击原理与防范
  2. 【Linux】在Linux环境下使用VSCode调试C/C++程序
  3. 【Python】自动轨迹绘制
  4. “Abp.AbpException: Unknown filter name: MayHaveTenant. Be sure this filter is registered before.”的解决
  5. 常用网站URL规划分析
  6. 微服务架构 性能提升_如何通过无服务器架构提高性能
  7. 网站加载速度 优化_您肯定要优化网站的加载速度。 这是如何做。
  8. axure菜单移动隐藏_如何使用隐藏的移动网络更快地完成工作
  9. 121_Power Query之R.Execute的read.xlsxODBC
  10. 怎么解决python遇到问题_新手常见Python错误及异常解决处理方案