C++实现中缀转后缀的示例详解

单位数加减乘除

例如:2+3*(4-9)

定义一个栈内优先级

运算符号 优先级
+、- 3
*、/ 5
( 1
) 6
# 0

定义一个栈外优先级

运算符号 优先级
+、- 4
*、/ 2
( 6
1
# 0

整个过程如下:

首先将#入栈,这是为了让运算符与栈内的符号进行比较是否入栈,否则无法判断

  1. 2为数字,直接输出
  2. +和#进行运算符比较,因为+的优先级大于#,入栈
  3. 3为数字,直接输出
  4. (和+进行比较,(的优先级比+大,将+取出输出,将(入栈
  5. 4为数字,直接输出
  6. -的优先级比’(‘大,直接入栈。注意:此时的’('为栈内优先级
  7. 9为数字。直接输出
  8. )优先级比-大,取出-,同时()配对了,也要将(取出
  9. 最后遍历栈内运算符即可

需要注意的点是:

就像这样栈内的头顶两个元素这样(+,下一个符号刚好是),需要考虑到,取完+号后,需要把(也去取出来

实现代码

#include<iostream>
#include<stack>
#include<string>
using namespace std;
//栈内优先级
int CompareIn(char c){
	if(c=='('){
		return 1;
	}
	if(c=='+'||c=='-'){
		return 3;
	}
	if(c=='*'||c=='/'){
		return 5;
	}
	if(c==')'){
		return 6;
	}
	if(c=='#'){
		return 0;
	}
}
//栈外优先级
int CompareOut(char c){
	if(c=='('){
		return 6;
	}
	if(c=='+'||c=='-'){
		return 2;
	}
	if(c=='*'||c=='/'){
		return 4;
	}
	if(c==')'){
		return 1;
	}
	if(c=='#'){
		return 0;
	}
}
int main(){
	string str;
	cin>>str;
	stack<char> q;
	q.push('#');
	for(int i=0;i<str.length();i++){
		if('1'<=str[i]&&str[i]<='9'){
			cout<<str[i];
		}else{
			if(CompareIn(q.top())<CompareOut(str[i])){
				q.push(str[i]);
			}else if(CompareIn(q.top())==CompareOut(str[i])){
				q.pop();
			}else if(CompareIn(q.top())>CompareOut(str[i])){
				char ch=q.top();
				q.pop();
				cout<<ch;
				if(str[i]!=')'){
					q.push(str[i]);
				}
			   if(CompareIn(q.top())==CompareOut(str[i])){
				q.pop();
		    	}
			}
		}
	}
	while(CompareIn(q.top())!=0){
		cout<<q.top();
		q.pop();
	}

}
}

到此这篇关于C++实现中缀转后缀的示例详解的文章就介绍到这了,更多相关C++中缀转后缀内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++中缀表达式转后缀表达式的方法

    本文实例为大家分享了C++中缀表达式转后缀表达式的具体代码,供大家参考,具体内容如下 1.初始化两个栈:运算符栈s1和储存中间结果的栈s2: 2.从左至右扫描中缀表达式: 3.遇到操作数时,将其压s2: 4.遇到运算符时,比较其与s1栈顶运算符的优先级: 1).如果s1为空,或栈顶运算符为左括号"(",则直接将此运算符入栈: 2).否则,若优先级比栈顶运算符的高,也将运算符压入s1 3).否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较: 5.

  • C++利用栈实现中缀表达式转后缀表达式

    本文实例为大家分享了C++实现中缀表达式转后缀表达式的具体代码,供大家参考,具体内容如下 题目:现有中缀表达式如:1+(2-3)*4+10/5 请用栈的特性编写一个程序,使得程序输出后缀表达式 分析如下: STEP1: 1+(2-3)*4+10/5 首先遇到第一个输入是数字1,数字在后缀表达式中都是直接输出,接着是符号"+",入栈: STEP2: 1+(2-3)*4+10/5 第三个字符是"(",依然是符号,入栈,接着是数字2,输出,然后是符号"-&quo

  • C++实现中缀表达式转化为后缀表达式详解

    目录 1.题目描述 2.输入输出 3.解题思路 4.样例解析 5.代码实现 5.1.优先级确认 5.2.转换函数 1.题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级). 如:中缀表达式 3*(5–2)+7 对应的后缀表达式为:352-*7+ . 请将给出的中缀表达式转化为后缀表达式并输出. 2.输入输出 输入样例: 2+4*8+(8*8+1)/3 输出样例: 248*+88*1

  • C++实现中缀表达式转后缀表达式

    本文实例为大家分享了C++实现中缀表达式转后缀表达式的具体代码,供大家参考,具体内容如下 一.思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可 1.用字符数组存储整行输入的中缀表达式: 2.接着从字符数组的0位置开始判断字符,如果是数字,那就要判断后面是否是数字,如果是就不断扫描组成一个整数 (暂不考虑负数和小数),最终组成一个整数,然后输出这个数(因为不用计算,所以直接输出即可): 3.如果是左括号,直接进符号栈: 4.如果是操作运算符,与符号栈的栈顶元素比较优先级:如果高就压入

  • C++实现中缀转后缀的示例详解

    单位数加减乘除 例如:2+3*(4-9) 定义一个栈内优先级 运算符号 优先级 +.- 3 *./ 5 ( 1 ) 6 # 0 定义一个栈外优先级 运算符号 优先级 +.- 4 *./ 2 ( 6 ) 1 # 0 整个过程如下: 首先将#入栈,这是为了让运算符与栈内的符号进行比较是否入栈,否则无法判断 2为数字,直接输出 +和#进行运算符比较,因为+的优先级大于#,入栈 3为数字,直接输出 (和+进行比较,(的优先级比+大,将+取出输出,将(入栈 4为数字,直接输出 -的优先级比’(‘大,直接入

  • Java中缀表达式转后缀表达式流程详解

    目录 一.栈 1.栈的基本介绍 2.栈的底层实现 二.中缀表达式转后缀表达式 1.拆解中缀表达式 2.中缀转后缀的算法 3.中缀转后缀代码解析 4.对后缀表达式进行计算 一.栈 1.栈的基本介绍 栈是⼀个先⼊后出的有序列表.栈(stack)是限制线性表中元素的插⼊和删除只能在线性表的同⼀端进⾏的⼀种特殊线性表.允许插⼊和删除的⼀端,为变化的⼀端,称为栈顶(Top),另⼀端为固定的⼀端,称为栈底(Bottom). 根据栈的定义可知,最先放⼊栈中元素在栈底,最后放⼊的元素在栈顶,⽽删除元素刚好相反,

  • Go语言中的字符串处理方法示例详解

    1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号("")或反引号(``)定义. 双引号:"", 用于单行字符串. 反引号:``,用于定义多行字符串,内部会原样解析. 示例: // 单行 "心有猛虎,细嗅蔷薇" // 多行 ` 大风歌 大风起兮云飞扬. 威加海内兮归故乡. 安得猛士兮守四方! ` 字符串支持转义

  • vue cli4下环境变量和模式示例详解

    本文介绍了vue cli4下环境变量和模式示例详解,分享给大家,具体如下: 官方文档 环境变量 一个环境变量文件只包含环境变量的键值对: NODE_ENV=development VUE_APP_BASE_URL=http://127.0.0.1:8080/ 注意: NODE_ENV - 是 "development"."production" ."test"或者自定义的值.具体的值取决于应用运行的模式 BASE_URL - 会和 vue.con

  • File.createTempFile创建临时文件的示例详解

    API参数: /** fileName: 临时文件的名字, 生成后的文件名字将会是[fileName + 随机数] suffix: 文件后缀,例如.txt, .tmp parentFile: 临时文件目录,如果不指定,则默认把临时文件存储于系统临时文件目录上 */ public static File createTempFile(String fileName, String suffix, File parentFile) 代码如下: import java.io.File; import

  • 使用java8 API遍历过滤文件目录及子目录和隐藏文件示例详解

    1. 使用Files.list()迭代目录及其子目录文件 Files.list()可以迭代目录及其子目录文件 Files.list(Paths.get(".")) //当前目录 .forEach(System.out::println); 输出: .\filename1.txt .\directory1 .\filename2.txt .\Employee.java 2. 使用 filter表达式过滤文件 过滤器函数引用,isRegularFile表示普通文件 Files.list(P

  • Java实现图片裁剪功能的示例详解

    目录 前言 Maven依赖 代码 验证一下 前言 本文提供将图片按照自定义尺寸进行裁剪的Java工具类,一如既往的实用主义. Maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.1.1-jre</version> </dependency> <dependen

  • Python绘制惊艳的桑基图的示例详解

    目录 桑基图简介 什么是桑基图? 如何绘制桑基图? 桑基图绘图基础 调整节点位置和图表宽度 添加有意义的悬停标签 桑基图简介 很多时候,我们需要一种必须可视化数据如何在实体之间流动的情况.例如,以居民如何从一个国家迁移到另一个国家为例.这里演示了有多少居民从英格兰迁移到北爱尔兰.苏格兰和威尔士. 从这个 桑基图 (Sankey)可视化中可以明显看出,从England迁移到Wales的居民多于从Scotland或Northern Ireland迁移的居民. 什么是桑基图? 桑基图通常描绘 从一个实

  • SpringMVC视图转发重定向区别及控制器示例详解

    目录 SpringMVC视图 一.ThymeleafView 二.转发视图 三.重定向视图 四.转发和重定向区别 五.视图控制器 view-controller SpringMVC视图 SpringMVC 中的视图是 View 接口,视图的作用是渲染数据,将模型 Model 中的数据展示给用户. 视图的种类很多,默认有:转发视图和重定向视图. 若使用的视图技术为 Thymeleaf,在 SpringMVC 的配置文件中配置了 Thymeleaf 的视图解析器,由此视图解析器解析之后所得到的是 T

  • Python Flask实现图片上传与下载的示例详解

    目录 1.效果预览 2.新增逻辑概览 3.tuchuang.py 逻辑介绍 3.1 图片上传 3.2 图片合法检查 3.3 图片下载 4.__init__.py 逻辑介绍 5.upload.html 介绍 5.1 upload Jinja 模板介绍 5.2 upload css 介绍(虚线框) 5.3 upload js 介绍(拖拽) 1.效果预览 我们基于 Flask 官方指导工程,增加一个图片拖拽上传功能,效果如下: 2.新增逻辑概览 我们在官方指导工程上进行增加代码,改动如下: 由于 fl

随机推荐