首页 > 其他分享 >前中后缀表达式学习笔记

前中后缀表达式学习笔记

时间:2024-02-27 09:46:21浏览次数:25  
标签:遍历 前中 列表 运算符 后缀 堆栈 表达式

前言

表达式是数学和计算机编程中常见的概念,用于表示运算和计算过程。前缀、中缀和后缀表达式都是不同的方式来表示数学表达式,它们在计算机科学和计算器设计中都有一定的应用。

中缀表达式(Infix Expression):
这是最常见的数学表达式表示方法,也是人们通常在书写数学公式时使用的方式。中缀表达式中,运算符位于操作数之间。例如:3 + 5 * 2。然而,中缀表达式在计算机内部求值时需要考虑运算符的优先级和括号的影响,这使得计算过程相对复杂。

前缀表达式(Prefix Expression):
前缀表达式也称为波兰式(Polish Notation),它将运算符放在操作数之前。例如:+ 3 * 5 2。前缀表达式的一个优点是,不需要考虑运算符的优先级和括号,计算过程相对简单。为了计算前缀表达式,可以使用堆栈数据结构来辅助计算。

后缀表达式(Postfix Expression):
后缀表达式也称为逆波兰式(Reverse Polish Notation,RPN),它将运算符放在操作数之后。例如:3 5 2 * +。与前缀表达式类似,后缀表达式也不需要考虑运算符的优先级和括号,计算过程较为简单。计算后缀表达式同样可以使用堆栈来实现。

通过将中缀表达式转换为前缀或后缀表达式,可以简化表达式的计算过程。这在编写计算器、编译器和计算机代数系统等领域中都有应用

中缀表达式转换为后缀表达式

在初赛中前中后缀表达式是个考点

当将中缀表达式转换为后缀表达式时,可以使用堆栈来辅助处理运算符和操作数。以下是将中缀表达式转换为后缀表达式的详细过程:

创建一个空堆栈,用于存放运算符。

初始化一个空列表,用于存放最终的后缀表达式。

从左到右遍历中缀表达式的每个字符:

1.遇到操作数(数字)时,将其添加到后缀表达式列表中。

遇到运算符时,需要考虑运算符的优先级以及堆栈中已有的运算符。

a. 如果堆栈为空,或者堆栈顶部的运算符为左括号 "(",直接将当前运算符入栈。

b. 如果当前运算符为 "+" 或 "-",而堆栈顶部的运算符不是左括号 "(",则将堆栈中的所有运算符弹出并加入后缀表达式列表中,直到堆栈为空或者遇到左括号为止,然后将当前运算符入栈。

c. 如果当前运算符为 "" 或 "/",而堆栈顶部的运算符为 "" 或 "/",也将堆栈中的所有运算符弹出并加入后缀表达式列表中,然后将当前运算符入栈。

d. 对于其他运算符,直接将当前运算符入栈。

2.遇到左括号 "(" 时,直接将其入栈。

3.遇到右括号 ")" 时,将堆栈中的运算符弹出并加入后缀表达式列表中,直到遇到匹配的左括号为止,然后将左括号弹出,但不加入后缀表达式列表。

4.遍历完整个中缀表达式后,将堆栈中剩余的运算符依次弹出并加入后缀表达式列表。

5.最终得到的后缀表达式列表就是转换后的后缀表达式。

例如,将中缀表达式 3 + 5 * 2 转换为后缀表达式:

第一次遍历到3,发现是数字,就把它放进列表里

运算符栈:

后缀表达式列表:3

第二次遍历到+,发现是符号,而堆栈顶部的运算符不是左括号,就把它push进栈里

运算符栈:+

后缀表达式列表:3

第三次遍历到5,发现是数字,就把它放进列表里

运算符栈:+

后缀表达式列表:3 5

第四次遍历到,发现堆栈顶部的运算符不为 "" 或 "/",就把它push进栈里

运算符栈:+ *

后缀表达式列表:3 5

第五次遍历到2,发现是数字,就把它放进列表里

运算符栈:+ *

后缀表达式列表:3 5 2

所以后缀表达式为3 5 2 * +

例如,将中缀表达式 1+14(5+1-4) 转换为后缀表达式:

第一次遍历到1,发现是数字,就把它放进列表里

运算符栈:

后缀表达式列表:1

第一次遍历到+,发现是符号,而堆栈顶部的运算符不是左括号,就把它push进栈里

运算符栈:+

后缀表达式列表:1

第二次遍历到1,发现是数字,就把它放进列表里

运算符栈:+

后缀表达式列表:1 1

第三次遍历到,发现堆栈顶部的运算符不为 "" 或 "/",就把它push进栈里

运算符栈:+ *

后缀表达式列表:1 1

第四次遍历到4,发现是数字,就把它放进列表里

运算符栈:+ *

第五次遍历到,发现堆栈顶部的运算符为 "" ,则一直弹到不为 "*" 或 "/"为止

运算符栈:+ *

后缀表达式列表:1 1 4 *

第六次遍历到"(",把它push进栈里

运算符栈:+ * (

后缀表达式列表:1 1 4 *

第七次遍历到"5",就把它放进列表里

运算符栈:+ * (

后缀表达式列表:1 1 4 * 5

第八次遍历到"+",发现堆栈顶部的运算符是左括号 "(",把它push进栈里

运算符栈:+ * ( +

后缀表达式列表:1 1 4 * 5

第九次遍历到"1",就把它放进列表里

运算符栈:+ * ( +

后缀表达式列表:1 1 4 * 5 1

第十次遍历到"-",发现堆栈顶部的运算符不是左括号 "(",将堆栈中的所有运算符弹出并加入后缀表达式列表中,直到堆栈为空或者遇到左括号为止,然后将当前运算符入栈。

运算符栈:+ * ( -

后缀表达式列表:1 1 4 * 5 + 1 +

第十一次遍历到"4",发现堆栈顶部的运算符不是左括号 "(",将堆栈中的所有运算符弹出并加入后缀表达式列表中,直到堆栈为空或者遇到左括号为止,然后将当前运算符入栈。

运算符栈:+ * ( -

后缀表达式列表:1 1 4 * 5 + 1 + 4

第十二次遍历到")",发现将堆栈中的运算符弹出并加入后缀表达式列表中,直到遇到匹配的左括号为止,然后将左括号弹出,但不加入后缀表达式列表。

运算符栈:+ *

后缀表达式列表:1 1 4 * 5 + 1 + 4 -

所以后缀表达式为1 1 4 * 5 + 1 + 4 - * +

以下是代码

void mid_to_back(string s){
	int len=s.size();
	for(int i=0;i<len;i++){
		if(s[i]>='0'&&s[i]<='9') dat.push(s[i]);
		if(s[i]=='(') opt.push(s[i]);
		if(s[i]==')'){
			char t=opt.top();
			while(t!='('){
				opt.pop();
				dat.push(t);
				t=opt.top();
			}
			opt.pop();
		}
		if(change(s[i])>=1&&change(s[i])<=3){
			//print();
			if(!opt.empty()){
				char t=opt.top();
				while(!opt.empty()&&change(s[i])<=change(t)){
					if(change(s[i])==change(t)&&s[i]=='^') break;
					opt.pop();
					dat.push(t);
					if(!opt.empty()) t=opt.top();
				}
			}
			opt.push(s[i]);
		}
	}
	while(!opt.empty()){
		char t=opt.top();
		opt.pop();
		dat.push(t);
	}
	while(!dat.empty()){
		char t=dat.top();
		dat.pop();
		opt.push(t);
	}
	while(!opt.empty()){
		char t=opt.top();
		cout<<t<<' ';
		opt.pop();
		dat.push(t);
	}
	cout<<endl;
}

标签:遍历,前中,列表,运算符,后缀,堆栈,表达式
From: https://www.cnblogs.com/wuhupai/p/18036196

相关文章

  • 后缀表达式
    一、题目描述P8683[蓝桥杯2019省B]后缀表达式二、算法简析显然,这道题要用贪心思想。想当然的,我们会先进行降序排序,将大的相加,在减去小的。然而,这种想法是错误的。因为这道题要求的是后缀表达式的最大值,为了便于理解,我们转换为中缀表达式的最大值,这里就有了一个隐含条件—......
  • 正则表达式拾遗
    正则表达式拾遗正则介绍正则表达式,又称规则表达式,(RegularExpression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”),是计算机科学的一个概念。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符......
  • springBoot 整合 groovy 实现表达式解析 该示例可以用于配置告警规则
    1.引入pom<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>3.0.9</version></dependency><dependency......
  • 后缀数组学习笔记 应用篇
    一些后缀数组的应用。利用\(sa\)和\(rk\)数组这类题目通常需要发掘一些性质,转化为求串的字典序最小/大后缀或长度固定的子串。P3809【模板】后缀排序后缀数组板子。P6095[JSOI2015]串分割二分答案串的排名。CF1923FShrink-Reverse转化为求长度为\(len\)的字典......
  • 正则表达式
    匹配单个英文字母匹配区间[0-9a-zA-Z]不用逗号!!匹配特殊字符匹配非集快捷方式\d匹配全数字\w匹配数字、字母和下划线\s匹配空格tab换行\bxxx\b匹配单词边界(注意不要加中括号,不加中括号指xxx作为一体,加中括号表示可拆成字母分别匹配)以上所有快......
  • 正则表达式
     介绍:一个简单的Java正则工具类,其中包含了对用户名和密码的正则表达式。 要求:用户名的正则表达式:4至8位,只能为单独的英文或中文(中文的话为四位)。密码的正则表达式:6至12位,包含字母、数字、特殊字符。publicclassRegexUtil{//用户名的正则表......
  • 刘铁猛C#学习笔记9 表达式、语句2
    1.循环语句C#中有四种循环while循环,do-while循环,for计数循环,foreach遍历循环(1)while循环while()括号内写循环条件,一个bool类型表达式之后写一个嵌入式语句作为循环体 (2)do-while循环先执行一次,在判断循环条件,所以循环体至少会执行一次do{循环体}while(循环条件......
  • 刘铁猛C#学习笔记8 表达式、语句1
    表达式1.表达式的定义通用定义:一种专门用来求值的语法实体C#中定义:由一个或多个操作数,零个或多个操作符,功能是求值,求值的结果可能是四类Singlevalue、object、method、namespace(说明至少要有一个操作数,但不一定要有操作符)  C#中表达式值的类型:(1)单值Singlevalue......
  • idea正则表达式ctrl+R替换
    正则表达式进行查找替换在idea上ctrl+F查找时,可以用类似label="(.*?)"来匹配所有label和其等于的值:注意得选中后面的".*"这是一个正则表达式的匹配:(.*?)用一对括号捕获组——捕获组可以提取双引号中的实际值.匹配任何字符,*出现任意次数,?表示......
  • 后缀数组
    虽然这是基础算法,但我已经好几次忘记它怎么写了,反倒是SAM记得很牢。为了避免比赛中因这个爆蛋,我打算仔细梳理一下它的原理。问题:给你一个字符串,你需要求出\(sa_i,rk_i\),其中\(sa_i\)表示排名为\(i\)的后缀,\(rk_i\)表示后缀\(i\)的排名。首先暴力就是直接快排,里面......