首页 > 其他分享 >中缀表达式转换为后缀表达式

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

时间:2023-05-30 17:05:12浏览次数:39  
标签:操作数 中缀 后缀 运算符 括号 表达式


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

所谓中缀表达式,指的是运算符处于操作数的中间(例:3 * ( 4 + 2 )),中缀表达式是人们常用的算术表示方法,但中缀表达式不容易被计算机解析,因为既要考虑运算符的优先级,还要考虑括号的处理。但中缀表达式仍被许多程序语言使用,因为它符合人们的普遍用法。后缀表达式,指的是不包含括号,运算符放在两个操作数的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,也不需要考虑括号)。

给出一个中缀表达式,请将其转换为后缀表达式并输出。

输入格式:
只有一行,是一个长度不超过1000的字符串,表示一个中缀表达式。表达式里只包含±*/与小括号这几种符号。其中小括号可以嵌套使用。运算符、操作数之间用一个空格分隔,数据保证输入的操作数中不会出现负数,保证除数不会为0。

输出格式:
输出对应的后缀表达式。运算符、操作数之间用一个空格分隔,但行尾无多余空格。

输入样例:
3 * ( 4 + 2 )
输出样例:
3 4 2 + *

入栈出栈…
是数字直接输出,考虑到有的数字会不是个位数需要想办法计算完之后再输出
是运算符就查看栈顶元素,如果栈顶元素运算符优先级大于等于目前读入的运算符优先级,就弹出栈顶运算符,直到小于或者栈空为止
如果是左括号直接入栈
如果是右括号,弹出栈里的元素直到遇见左括号.

#include<iostream>
#include<stack>
#define print {if(flag==1)cout<<' ';else flag=1;}
using namespace std;
int lev(char ch) {
	if(ch=='+'||ch=='-')return 0;
	else if(ch=='*'||ch=='/')return 1;
	else if(ch=='(')return 100;
	abort();
}
int flag;
int main() {
	int t=0;
	int flag2=0;
	char ch;
	string str="+-*/";
	stack<char> st;
	// freopen("7-3 中缀表达式转换为后缀表达式.txt","r",stdin);
	while((ch=getchar())!=EOF) {
		if(ch==' '){
			if(flag2==1){
				print cout<<t;
				t=0;
				flag2=0;
			}
			continue;
		}
		if(str.find(ch)!=string::npos) {
			if(st.empty()||lev(ch)>lev(st.top())) {
				st.push(ch);
			} else if(lev(ch)<=lev(st.top())) {
				while(!st.empty()&&lev(ch)<=lev(st.top())&&st.top()!='(') {
					print cout<<st.top();
					st.pop();
				}
				st.push(ch);
			}
		} else if(ch==')') {
			while(st.top()!='(') {
				print cout<<st.top();
				st.pop();
			}
			st.pop();
			continue;
		} else if(ch=='(') {
			st.push('(');
		} else {
			t=t*10+ch-'0';
			flag2=1;
		}
	}
	if(flag2==1){
		print cout<<t;
	} 
	while(!st.empty()) {
		print cout<<st.top();
		st.pop();
	}
}


标签:操作数,中缀,后缀,运算符,括号,表达式
From: https://blog.51cto.com/u_16144724/6380479

相关文章

  • Elasticsearch专题精讲——API规范—— 一般表达式
    API规范——一般表达式1、格式化搜索结果 当任何请求URL加pretty=true参数时,返回的JSON都是格式化的(仅用于调试)。另一个选项是设置format=yaml,结果以更可读的yaml格式返回。2、可读输出 统计数据以适合人(例如"exists_time":"1h"或"size":"1KB")和计算机(例如......
  • [Quicker] 变量 表达式 插值
    插值($$开始)用于拼接文本,表达式($=)用于计算比较插值$$你好,{name},最后的访问路径:{lastPath},剪贴板文本为:{[cliptext]}$${词典变量["key3"]}$${词典变量.key3}$${列表变量[3]}$${列表变量.3}如果插值处理后,结果仍然以"$$"or"$="开始,则再次进行插值或......
  • java集合过滤出符合条件的List元素集合(lambda表达式)
    使用Java8中的lambda表达式过滤ModelMapmodel=newModelMap();TSmClazzTSmClazz=tSmClazzService.get(id);List<Student>students=TSmClazz.getStudents();if(flag.equals("0")){List<Student>boys......
  • 【Java】Lambda表达式(三)
    常用Lambda表达式1、遍历finalList<String>list=Arrays.asList("zhangsan","lisi","wangwu","lishan");list.forEach(System.out::println);;2、排序finalList<String>list=Arrays.asList("zhangsan",......
  • net-core(EF Core)-使用表达式树还是委托
    usingMicrosoft.EntityFrameworkCore;usingMicrosoft.EntityFrameworkCore.Metadata.Builders;publicclassMemberConfig:IEntityTypeConfiguration<Member>{publicvoidConfigure(EntityTypeBuilder<Member>builder){builder.ToTa......
  • 基于Expression Lambda表达式树的通用复杂动态查询构建器——《剧透一下》
    前篇《https://www.cnblogs.com/ls0001/p/17437225.html》有大佬在评论里剧透了,这里就来一遍剧透。  通常,前后端分离的系统要在前端查询数据是提交一个带着查询条件参数的表单,比如A=1,B=2,类似样,后端接收到表单需要将这些条件参数拼接成查询需要写代码,并且表单结构通常是不带查......
  • 正则表达式
    正则表达式.matches字符类(只匹配一个字符)[abc]只能是a,b或c[^abc]除了a,b,c之外的任何字符[a-zA-Z]a到zA到Z[a-d[m-p]]a到d或m到p[a-z&&[def]]a-z和def的交集为:d,e,f[a-z&&[^bc]]a-z和非bc的交集(等同于[ad-z])[a-z&&[^m-p]]a到z和除了m到p的......
  • 正则表达式语法
    1. 正则表达式语法接上2. 元字符-字符匹配符  8832.1 应用案例  884-855代码在com.stulzl.regexp03RegExp03packagecom.stulzl.regexp03;importjava.util.regex.Matcher;importjava.util.regex.Pattern;//演示元字符-字符匹配符884-885publicclassRegExp03{......
  • javascript常用正则表达式
    javascript身份证号验证正则1.//这个可以验证15位和18位的身份证,并且包含生日和校验位的验证。2.//如果有兴趣,还可以加上身份证所在地的验证,就是前6位有些数字合法有些数字不合法。3.4.function5.num=num.toUpperCase();6.//身份证号码为15位或者18......
  • 压栈思想计算Java运算表达式
         栈的规则是先进后出。利用压栈的思想来计算四则运算表达式是这样的:我们给定两个栈,一个用来存放数字、一个用来存放对应的操作符。假定我们有一个给定的四则运算表达式a+b+c/d*(e+f)-d*a,那我们先把这个表达式拆分成一个个的数字或者是运算符、或者就是括号了。然后我们......