目录

一、前缀中缀后缀表达式

1.中缀表达式

2.前缀表达式

3.后缀表达式

二、中缀转后缀


一、前缀中缀后缀表达式

1.中缀表达式

中缀表达式就是平常生活中计算式子的写法,例如:(3+4)*5-6 就是一个中缀表达式

2.前缀表达式

1)前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前

2)要想知道前缀表达式怎么写,需要先了解前缀表达式在计算机中是怎样求值的:从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们进行相应的计算,并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。

( 3 + 4 )* 5 - 6 的前缀表达式为 - * + 3 4 5 6

3.后缀表达式

1)后缀表达式又称逆波兰表达式,运算符位于操作数之后

2)后缀表达式在计算机中时怎么求值的:从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们进行相应的计算,并将结果入栈;重复上述过程直到表达式最右端,最后算出的值即为表达式结果。

( 3 + 4 )* 5 - 6 的后缀表达式为 3 4 + 5 * 6 -

二、中缀转后缀

这里直接说过程,不解释原理了,会用就行。

中缀转后缀过程:

1.初始化两个栈:运算符栈s1和储存中间结果栈s2

2.从左至右扫描中缀表达式

3.遇到数字时,直接压入s2

4.遇到运算符时:

1)如果s1为空,或者栈顶为“(”,直接把遇到的运算符压入s1

2)若遇到的运算符比栈顶的运算符优先级高,直接把遇到的运算符压入s1

3)如果栈顶运算符的优先级大于等于遇到运算符的优先级,则把栈顶的运算符弹出并压入s2,然后继续让遇到的运算符和s1中新的栈顶运算符比较,直到遇到的运算符压入s1为止

5.遇到括号时:

1)如果遇到左括号“( ”,直接压入s1

2)如果遇到右括号“ )”,则把s1中最上面的左括号的上面的所有运算符依次弹出并压入s2,然后把这一对括号给清除,也就是把左括号给删了

6.重复步骤2-5,直到表达式最右边

7.将s1中剩余的运算符依次弹出并压入s2

8.此时s2中的顺序为后缀表达式,但依次弹出后为后缀表达式的逆序,所以把s2里面的东西依次弹出后,还需要逆序一下,就是后缀表达式了

但是,在实际写代码过程中,可以灵活运用这个思路,我们其实初始化一个栈就可以了,另外一个栈可以用集合替代,具体看代码:

using System;
using System.Text.RegularExpressions;
using System.Collections.Generic;namespace _8.中缀转后缀
{class Program{static void Main(string[] args){//测试string a = "1+((2+3)*4)-5";List<string> b = toInfixExpressionList(a);List<string> c = paresSuffixExpreesionList(b);foreach (var item in c){Console.Write(item);}}//中缀转后缀public static List<string> paresSuffixExpreesionList(List<string> ls){Stack<string> s1 = new Stack<string>();List<string> s2 = new List<string>();foreach (var item in ls){if(IsInt(item)){s2.Add(item);}else if(item == "("){s1.Push(item);}else if(item == ")"){while(s1.Peek() != "("){s2.Add(s1.Pop());}s1.Pop();}else{while(s1.Count != 0 && getValue(s1.Peek())>=getValue(item)&&s1.Peek() != "("){s2.Add(s1.Pop());}s1.Push(item);}}while(s1.Count!=0){s2.Add(s1.Pop());}return s2;}//返回优先级,数字越大优先级越高public static int getValue(string operation){switch(operation){case "+":return 1;case "-":return 1;case "*":return 2;case "/":return 2;default:return 0;}}//判断是否为正整数public static bool IsInt(string inString){Regex regex = new Regex("^\\d+$");return regex.IsMatch(inString.Trim());}//输入的string放入集合里public static List<string> toInfixExpressionList(string s){List<string> ls = new List<string>();int i = 0;//用于遍历string str = "";//对多位数拼接char c;//遍历到字符放入cwhile(i<s.Length){c = s[i];if(c<'0'||c>'9'){ls.Add(c.ToString());i++;}else{while(i<s.Length&&s[i]>='0'&&s[i]<='9'){c = s[i];str += c;i++;}ls.Add(str);str = "";}}return ls;}}
}

把string变成list(集合)容易操作。

为什么用一个栈就行:理解的时候用两个栈更好理解,实际写代码过程中,只需要初始化一个栈(s1)和一个集合(s2),那为什么另一个栈(s2)变成集合更好,因为变成集合后,就可以不用逆序就是最后的后缀表达式(可以直接用),如果s2用栈的话,最后弹出后,还需要再逆序一下才为后缀表达式。

C#数据结构-前缀中缀后缀+中缀转后缀相关推荐

  1. 【数据结构与算法】【12】前缀表达式、中缀表达式、后缀表达式

    什么是前缀表达式.中缀表达式.后缀表达式 前缀表达式.中缀表达式.后缀表达式,是通过树来存储和计算表达式的三种不同方式 以如下公式为例 (a+(b−c))∗d( a+(b-c) )*d(a+(b−c) ...

  2. 数据结构 - 拓展突破(C++实现中缀表达式转前缀表达式,中缀表达式转后缀表达式,前缀表达式求值,中缀表达式求值)

    文章目录 1. C++中缀表达式转后缀表达式 2. C++中缀表达式转前缀表达式 3. C++后缀表达式求值 4. C++前缀表达式求值 1. C++中缀表达式转后缀表达式 输入中缀表达式样例: 2+ ...

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

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

  4. (数据结构)前缀,后缀以及中缀表达式

    中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 前缀表达式(前缀记法.波兰式) 前缀表达式是一种没有括号的 ...

  5. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  6. 数据结构前缀,后缀,中缀表达式

    [cpp] view plain copy   [cpp] view plain copy   <span style="color: rgb(51, 51, 51); font-fa ...

  7. 数据结构:表达式之中缀转后缀

    中缀表达式是最常用的算术表达式,运算符在运算数中间,运算需要考虑运算符优先级. 后缀表达式是计算机容易运算的表达式,运算符在运算数后面,从左到右进行运算,无需考虑优先级,运算呈线性结构. 先举个简单的 ...

  8. 前缀表达式、中缀表达式、后缀表达式的区别

    一.三者的概念(参考维基百科) 1.1中缀表达式 中缀表达式是符合人类直觉的一种表达方式,其特点是操作符(二元操作符)在中间,操作数在两侧. 例如 3 + 4 ,   5 - 6 * 7,     ( ...

  9. 前缀表达式,中缀表达式和后缀表达式的定义与联系(超详细)

    目录 前缀.中缀.后缀表达式 前缀表达式 前缀表达式的计算机求值 中缀表达式 后缀表达式 后缀表达式的计算机求值 中缀表达式转化为前缀和后缀表达式 小结 前缀.中缀.后缀表达式 前缀.中缀.后缀表达式 ...

最新文章

  1. MyBatis基础知识汇总
  2. STM32 电机教程 11 - BLDC 6 步方波开环速度控制
  3. 程序运行的时间的估算
  4. c语言程序设计实践课选题,c语言程序设计实践实验题目
  5. 第25版 OpenStack Yoga 已发布
  6. windows下,‘nmake‘不是内部或外部命令,也不是可运行的程序或批处理文件
  7. statsmodels常用函数(更新中)
  8. 微信支付亲属卡新增“其他亲人”选项 “子女”增加至三张
  9. RpcException:No provider available for remote service异常
  10. 赋值语句、变量、数学表达式、位运算详解(C++)
  11. python发明小故事简写_科学发明小故事10字以上
  12. Delphi7调用dll(图文教程)2021最新
  13. 用户·角色·权限·表
  14. mysql中文表头转为英文字名_中文名字转换英文名字
  15. SRE(站点可靠性工程)介绍
  16. google工具栏中的自定义搜索按钮
  17. DetachedCriteria查询和子查询
  18. thinkphp phpmailer发送邮件
  19. 图片上添加自定义标记,可点击,可删除,可长按移动
  20. Burpsuite+夜神模拟器对app抓包(安卓7及其以上)

热门文章

  1. 服务器虚拟主机安装什么软件,虚拟主机软件如何安装
  2. 用区块链解决慈善业“痛点”,这又是形式大于实质的一场秀?
  3. R数据分析:结合APA格式作图大法讲讲ggplot2和ggsci,请收藏
  4. 如何解决桌面图标消失/变白
  5. java readfile函数_从fs.readFile获取数据
  6. Intel汇编-FPU状态
  7. [手游屌丝研究] 手游IP市场调查:授权金似北京房价【一】
  8. [论文精读]BERT
  9. 【经济学】离岸人民币和在岸人民币
  10. 东北大学2022年计算机考研复试在几月