将中缀表达式转换为后缀表达式的算法思想如下:

  从左往右开始扫描中缀表达式

  遇到数字加入到后缀表达式

  遇到运算符时:

    1、若为‘(’,入栈

    2、若为’)‘,把栈中的运算符依次加入后缀表达式,直到出现'(',’(‘出栈,退出该次循环

    3、若除’(‘ 和 ‘)’,要入栈的运算符优先级大于等于栈顶的运算符的优先级,直接入栈,否者,栈顶运算符出栈,再次比较,直到出现优先级低的运算符,或者栈为空,退出

  中缀表达式为空时,若栈不为空,栈中元素一直出栈,直到栈为空

运算符    (  *,/  +,-  )

栈内优先级  1  5  3    6

栈外优先级  6  4  2    1

C++实现如下:

#include <iostream>
#include <algorithm>
#include <string>
#include <stack>
#include <map>
using namespace std; int main()
{
string s_mid="a+b-a*((c+d)/e-f)+g";
string s_beh="";
stack<char> stk;
// stack<char> stk1; map<char,int> op;//利用map来实现运算符对应其优先级
op['(']=;
op[')']=;
op['+']=;
op['-']=;
op['*']=;
op['/']=;
string::iterator it=s_mid.begin();;
while(it!=s_mid.end())
{
if(op.count(*it))//判断该元素是否为运算符
{
if(*it==')')//情况2
{
while(stk.top()!='(')
{
s_beh+=stk.top();
stk.pop();
}
stk.pop();
}
else if(stk.empty()||*it=='('||op[*it]>op[stk.top()])//情况1、情况3
{
stk.push(*it);
}
else if(op[*it]<=op[stk.top()])//情况3
{
while(op[*it]<=op[stk.top()]&&(!stk.empty()))
{
s_beh+=stk.top();
stk.pop();
if(stk.empty()) break;
}
stk.push(*it);
}
}
else
{
s_beh+=*it;
}
it++; // cout<<s_beh<<'\t'; 输出每次结构
// stk1=stk;
// while(!stk1.empty()) 输出栈内情况
// {
// cout<<stk1.top();
// stk1.pop();
// }
// cout<<endl; if(it==s_mid.end())//当中缀表达式输出完成,所有元素出栈
{
while(!stk.empty())
{
s_beh+=stk.top();
stk.pop();
}
break;
}
}
cout<<s_beh<<endl;
return ;
}

python实现如下:

#-*- coding:utf-8 -*-

if __name__=='__main__':
s_mid='23/b+(c*d-e*f)/g'
s_beh=''
d={'(':0,')':0,'+':1,'-':1,'*':2,'/':2};
l=[]
while(len(s_mid)):
if s_mid[0] in d.keys():
if s_mid[0]==')':
while True:
if l[len(l)-1]=='(':
break
else:
s_beh+=l.pop()
l.pop()
elif len(l)==0 or s_mid[0]=='(' or d[l[len(l)-1]]<d[s_mid[0]]:
l.append(s_mid[0])
elif d[l[len(l)-1]]>=d[s_mid[0]]:
while d[l[len(l) - 1]] >= d[s_mid[0]]:
s_beh+=l.pop()
if len(l)==0:
break
l.append(s_mid[0])
else:
s_beh+=s_mid[0]
s_mid=s_mid[1:]
if len(s_mid)==0:
while len(l):
s_beh += l.pop()
print s_beh

中缀表达式得到后缀表达式(c++、python实现)的更多相关文章

  1. ZH奶酪:Python 中缀表达式转换后缀表达式

    实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: ( ...

  2. 中缀表达式转后缀表达式(Python实现)

    中缀表达式转后缀表达式 中缀表达式转后缀表达式的规则: 1.遇到操作数,直接输出: 2.栈为空时,遇到运算符,入栈: 3.遇到左括号,将其入栈: 4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到 ...

  3. Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算

    中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...

  4. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

    #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...

  5. RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript

    1.利用栈(Stack)来存储操作数和操作符: 2.包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点: 2.1.将输入字符串转为数组: 2.2.对转换来的字符进行遍历:创建一个数组,用来给存储 ...

  6. 练习3.20 a 将中缀表达式转换为后缀表达式

    //将中缀表达式转换为后缀表达式 int main() { ; ]={,,,,,,,}; char tmp; PtrToStack s; s = CreateStack( MaxSize ); ) { ...

  7. NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  8. .net表达式计算器(中缀表达式转后缀表达式,支持20多个数学函数,支持函数嵌套)

    最近在网上查了一下表达工计算器的类库,发现Java版本的有一个比较成熟的叫W3EVal,好像是一个IBM工程师写的,.net就很少了(可能是我了解不够多),但投机取巧的实现思路有很多,比如: (1)将 ...

  9. hdu-1237 简单计算器---中缀表达式转后缀表达式

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 思路 ...

随机推荐

  1. GitHub 系列之「团队合作利器 Branch」

    Git 相比于 SVN 最强大的一个地方就在于「分支」,Git 的分支操作简直不要太方便,而实际项目开发中团队合作最依赖的莫过于分支了,关于分支前面的系列也提到过,但是本篇会详细讲述什么是分支.分支的 ...

  2. ATOM系列之-atom报错"Cannot load the system dictionary for zh-CN"

    atom报错"Cannot load the system dictionary for zh-CN" 想必很多人(程序猿&程序媛)都和我一样,喜欢的这款很拉风的代码编辑器 ...

  3. 在docker上运行.net core程序

    一.安装docker及镜像 1.在centos上安装docker,命令如下: # yum install docker 2.让docker随机启动: # service docker start# c ...

  4. C++中使用引用作为函数参数的优点

    1.传递引用给函数与传递指针的效果是一样的.这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标 对象(在主调函数中)的操作. ...

  5. linux文件的基本属性

    Linux 文件基本属性 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规 ...

  6. 深入理解Java虚拟机 第三章 垃圾收集器 笔记

    1.1   垃圾收集器 垃圾收集器是内存回收的具体实现.以下讨论的收集器是基于JDK1.7Update14之后的HotSpot虚拟机.这个虚拟机包含的所有收集器有: 上图展示了7种作用于不同分代的收集 ...

  7. appium---【已解决】【Mac】from appium import webdriver报错提示“Unresolved import webdriver”

    报错提示: from appium import webdriver提示Unresolved import webdriver 报错原因:没有安装Appium_Python_Client 解决办法: ...

  8. 报文ISO8583协议

    本人刚接触金融IT行业,对报文ISO8583协议也是刚刚了解,看了篇文章,个人觉得写得很好,特此分享如下: 如果单纯的讲IS08583那些字段的定义,我觉得没有什么意思,标准中已经对每个字段解释的非常 ...

  9. 游戏AI之感知(1)

    目录 感知 视觉感知 听力感知 其它感知 实现 感知 视觉感知 视觉感知是一种常见的感知. 在许多即时战略游戏或者类DOTA游戏里,一个单位的视觉感知往往是圆形范围的. 当然在其他大部分俯视角游戏里, ...

  10. Android Gradle defaultConfig详解及实用技巧

    实际项目中,都会应用Android Gradle Plugin,根据实际中的项目模块的职责,可以具体应用如下四种插件类型. 1,apply plugin: 'com.android.applicati ...