//中缀转后缀
#include<iostream>
#include<stack>
using namespace std; int prio(char x){
if(x=='*'||x=='/') return ;
if(x=='+'||x=='-') return ;
if(x=='(') return ;
else return -; }
void in_to_post(char* inorder,char* &post){
stack<char>S;
int k=;
while(*inorder){
//数字
if(*inorder>=''&&*inorder<=''){
post[k++] = *inorder;
}
//操作符
else{
if(S.empty()) {
S.push(*inorder);
}
else if(*inorder=='('){
S.push(*inorder);
}
else if(*inorder==')'){
while(S.top()!='('){
post[k++]=S.top();
S.pop();
}
S.pop();
}
else{
while(prio(*inorder)<=prio(S.top())){
post[k++]=S.top();
S.pop();
if(S.empty()) break;
}
S.push(*inorder);
}
}
inorder++;
}
if(!S.empty()){
char c =S.top();
post[k++] = c;
S.pop();
}
}
//后缀表达式求值
int cal(int a,int b,char c){
if(c=='+') return a+b;
else if(c=='-') return a-b;
else if(c=='*') return a*b;
else if(c=='/') return a/b;
else return ;
} int postcal(char* post){
stack <int > s;
while(*post){
if(*post >=''&& *post<=''){
s.push(*post);
}
else{
int a = s.top()-;
s.pop();
int b = s.top()-;
s.pop();
int c = cal(b,a,*post);
s.push(c+);
}
post++;
}
return s.top()-;
} int main(){
cout<<"输入中缀表达式:"<<endl;
char* inorder =new char;
cin>>inorder;
char* post= new char;
cout<<"后缀表达式为:";
in_to_post(inorder,post);
cout<<post<<endl;
int res = postcal(post);
cout<<"后缀表达式计算结果:"<<res<<endl;
}

求解思想:

中缀转后缀表达式:

  从左到右扫描输入的中缀表达式,若是数字,则直接输出到结果,若是运算符则判断:

  1. ‘(’ :直接入栈;

  2. ‘)’:依次把栈中的运算符输出到结果,知道出现‘(’,将左括号从栈中删除;

  3. 若是其他运算符,判断当前运算符与栈顶元素的优先级(*/ 为2,+-为1,( 为0,其他为-1),若是当前运算符优先级较高,则直接入栈,否则,依次输入比当前运算符优先级高或相等的运算符,知道遇到不符合条件的元素或者遇到左括号为止,再将当前运算符入栈。

  扫描结束后,将栈内存放的运算符依次输出到结果。

例如:3*5+((1+3)/2+1)

3 放入结果;          结果:3  栈内:

* 放入栈内;          结果:3  栈内:*

5 放入结果;            结果:35  栈内:*

+:将*输入,+放入栈内     结果:35*  栈内:+

( 放入栈内;          结果:35*  栈内:+(

( 放入栈内;          结果:35*  栈内:+((

1 放入结果;          结果:35*1  栈内:+((

+ 放入栈内;            结果:35*1  栈内:+((+

3 放入结果;          结果:35*13  栈内:+((+

):输出+,删除(;       结果:35*13+  栈内:+(

/ 放入栈内;           结果:35*13+  栈内:+(/

2 放入结果;          结果:35*13+2  栈内:+(/

+: 输出/,+放入栈内;     结果:35*13+2/  栈内:+(+

1 放入结果;           结果:35*13+2/1  栈内:+(+

):输出+,删除(;       结果:35*13+2/1+  栈内:+

把栈内剩余元素依次输出;      结果:35*13+2/1++  栈内:

后缀表达式求值:

  从左到右扫描输入的后缀表达式,若是数字则入栈;若是操作符,则从栈中取出两个数,进行相应计算后,将结果放回栈中,;扫描完后,栈顶剩余元素就是结果。

由于输入时并未区分数字和操作符,而是统一规定成了char 类型,所以要将每两个操作数计算的结果也要转换成ASCII码对应的字符类型,所以要进行+-48的操作。

也可以在一开始读取输入的时候就区分int类型和char类型,然后分开设栈。

C++ 中缀转后缀表达式并求值的更多相关文章

  1. 中缀表达式转逆波兰式(后缀表达式)求值 C++ Stack

    给一个包含小数的中缀表达式 求出它的值 首先转换为后缀表达式然后利用stack求出值 转换规则: 如果字符为'('  push else if 字符为 ')' 出栈运算符直到遇到‘(' else if ...

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

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

  3. C++ 使用栈求解中缀、后缀表达式的值

    1. 前言 表达式求值对于有知识积累的你而言,可以通过认知,按运算符的优先级进行先后运算. 但对计算机而言,表达式仅是一串普通的信息而已,需要通过编码的方式告诉计算机运算法则,这个过程中栈起到了至关重 ...

  4. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  5. Java数据结构和算法(六):前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  6. 栈的应用1——超级计算器(中缀与后缀表达式)C语言

    这里要学的程序主要用来实现一个功能——输入表达式输出结果,也就是一个计算器.效果如下: 这个程序主要有两个步骤:1.把中缀表达式转换为后缀表达式:2.计算后缀表达式的结果. 首先先明白几个问题: 1. ...

  7. C语言对表达式的求值顺序不是明确规定的

    讨论区看到的 WA来自那些递归下降求解的代码. 第一种情况,使用|| 和 &&: 例如s为所给串 int getval() { switch(s[c_s++]) { case 'p': ...

  8. 前缀、中缀、后缀表达式以及简单计算器的C++实现

    前缀表达式(波兰表达式).中缀表达式.后缀表达式(逆波兰表达式) 介绍 三种表达式都是四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解. 前缀表达式 前缀表达式是一种没有括号的算术表达式 ...

  9. java四则运算----前缀、中缀、后缀表达式

    接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现 ...

随机推荐

  1. Nginx Install 记录

    一.安装编译工具及库文件 yum -y install gcc yum -y install gcc-c++ yum -y install zlib; yum -y install pcre-deve ...

  2. ros kinetic安装rbx1

    1.首先安装一些依赖包 sudo apt-get install ros-kinetic-turtlebot-bringup \ ros-kinetic-turtlebot-create ros-ki ...

  3. .Net Core技术研究-Span<T>和ValueTuple<T>

    性能是.Net Core一个非常关键的特性,今天我们重点研究一下ValueTuple<T>和Span<T>. 一.方法的多个返回值的实现,看ValueTuple<T> ...

  4. LapSRN

    Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution 解决问题: 1.bicubic预处理上下采样,计算复杂度高 ...

  5. 关于React Native中FlatList的onEndReached属性频繁调用的一种解决办法

    FlatList组件是RN0.43后引入的组件.作为高性能列表组件,FlatList在ListView的基础上优化了加载性能并简化了渲染过程.不仅如此,该组件还提供了onRefresh和onEndRe ...

  6. 论文笔记【四】Semi-supervised Word Sense Disambiguation with Neural Models

    基于神经模型的半监督词义消歧 Dayu Yuan  Julian Richardson  Ryan Doherty  Colin Evans  Eric Altendorf Google, Mount ...

  7. sourceTree 代码未同步合并

    在同一个分支下,提交代码会有代码合并情形. 1.未同步代码前,提交代码 2.提交报错 3. 拉取未同步的提交代码 4.点击提交到暂存区, 5. 暂存区变成2条,再点击推送. 6.sourceTree ...

  8. textspan 转连接

    import 'package:flutter/material.dart'; import 'package:flutter/gestures.dart'; import 'package:url_ ...

  9. vue 父组件调用子组件内置方法

    背景介绍:外派到泰康做项目.这个项目中有个选择组织的功能,是一个树桩结构的懒加载,于是我就element-ui的tree组件封装了一个公共的组件. 但是后来发现他们的公司组织结构不是都请求的同一个接口 ...

  10. Python3 tkinter基础 Scale orient 横竖 resolution单步步长 length 长度 tickinterval 指示刻度

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...