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

 更新时间:2022年09月26日 16:03:03   作者:是皮蛋瘦肉周  
这篇文章主要为大家详细介绍了如何利用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++中缀转后缀内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言中变量与其内存地址对应的入门知识简单讲解

    C语言中变量与其内存地址对应的入门知识简单讲解

    这篇文章主要介绍了C语言中变量与其内存地址对应的入门知识简单讲解,同时这也是掌握指针部分知识的基础,需要的朋友可以参考下
    2015-12-12
  • C语言高级教程之变长数组详解

    C语言高级教程之变长数组详解

    这篇文章主要介绍了C语言中变长数组的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 在C++17中实现无锁数据结构的方法详解

    在C++17中实现无锁数据结构的方法详解

    在探索 C++17 中的无锁数据结构之前,我们首先需要理解无锁编程的基本概念及其在现代软件开发中的重要性,在这个章节中,我们将深入探讨无锁编程的概念,以及它如何满足人类对于更高效、更可靠软件的本能需求,文中通过代码示例介绍的非常详细,感兴趣的朋友可以参考下
    2023-12-12
  • 详解利用C语言如何实现简单的内存池

    详解利用C语言如何实现简单的内存池

    这篇文章主要给大家介绍了关于C语言如何实现简单的内存池的相关资料,设计内存池的目标是为了保证服务器长时间高效的运行,通过对申请空间小而申请频繁的对象进行有效管理,减少内存碎片的产生,合理分配管理用户内存,需要的朋友可以参考下
    2021-08-08
  • C 与 C++ 接口函数相互调用的实现

    C 与 C++ 接口函数相互调用的实现

    这篇文章主要介绍了C 与 C++ 接口函数相互调用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • OpenCV实现轮廓的发现

    OpenCV实现轮廓的发现

    这篇文章主要为大家详细介绍了OpenCV如何实现轮廓的发现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • C语言冒泡排序法的实现(升序排序法)

    C语言冒泡排序法的实现(升序排序法)

    这篇文章主要介绍了C语言冒泡排序法的实现(升序排序法),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • C++中指针和引用的区别详解

    C++中指针和引用的区别详解

    这篇文章主要介绍了C++中指针和引用的区别详解的相关资料,需要的朋友可以参考下
    2017-02-02
  • C++空间命名的使用

    C++空间命名的使用

    本文主要介绍了C++空间命名的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • C语言中的指针新手初阶指南

    C语言中的指针新手初阶指南

    指针是C语言的灵魂,精华之所在,指针强大而危险,用得好是一大利器,用得不好是一大潜在危害,下面这篇文章主要给大家介绍了C语言中指针的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10

最新评论