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

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

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

  遇到运算符时:

    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. synchronized和volatile简介

    简介 volatile是一个变量修饰符,而synchronized是一个方法或块的修饰符.所以我们使用这两种关键字来指定三种简单的存取变量的方式. 2345678 int i1;int geti1() ...

  2. B20J_2243_[SDOI2011]染色_树链剖分+线段树

    B20J_2243_[SDOI2011]染色_树链剖分+线段树 一下午净调这题了,争取晚上多做几道. 题意: 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成 ...

  3. BZOJ_4892_[Tjoi2017]dna_哈希

    BZOJ_4892_[Tjoi2017]dna_哈希 Description 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的 性状,但是研究人员 ...

  4. 查看keras自动给文件夹标号

    from tensorflow.contrib.keras.api.keras.preprocessing.image import ImageDataGenerator,img_to_array f ...

  5. 让你分分钟理解 JavaScript 闭包

    闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是 ECMAScript 规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概 ...

  6. Navicat:实现两个数据库结构同步和数据库对比

    Navicat版本:Navicat Premium 12 选择 工具 ——> 结构同步 ​ 选择源数据库和目标数据库,选择完成后点击右下角对比按钮 ​ 要修改的对象:源数据库和目标数据库中都有的 ...

  7. 【TCP协议】(3)---TCP粘包黏包

    [TCP协议](3)---TCP粘包黏包 有关TCP协议之前写过两篇博客: 1.[TCP协议](1)---TCP协议详解 2.[TCP协议](2)---TCP三次握手和四次挥手 一.TCP粘包.拆包图 ...

  8. 深度学习与计算机视觉:基于Python的神经网络的实现

    在前面两篇文章介绍了深度学习的一些基本概念,本文则使用Python实现一个简单的深度神经网络,并使用MNIST数据库进行测试. 神经网络的实现,包括以下内容: 神经网络权值的初始化 正向传播 误差评估 ...

  9. ubuntu中使用docker部署.netcore2.1

     概述    .netcore发布这么久,到现在才在项目中实际运用,之前算是了解一点,一般找工作都会问是否运用过.netcore,软件研发来说,如果这个技术没用过,觉得挺难,其实不难..netcore ...

  10. 实例分析Vue.js中 computed和methods不同机制

    在vue.js中,有methods和computed两种方式来动态当作方法来用的 1.首先最明显的不同 就是调用的时候,methods要加上() 2.我们可以使用 methods 来替代 comput ...