//中缀转后缀
#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. Roomblock: a Platform for Learning ROS Navigation With Roomba, Raspberry Pi and RPLIDAR(转)

      What is this? "Roomblock" is a robot platform consists of a Roomba, a Raspberry Pi 2, a ...

  2. 详解PHP中foreach

    foreach有两种语法: 第一种:遍历给定的 数组语句 array_expression 数组.每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下 ...

  3. 保存配置,获取配置,XML

    private void SaveSOConfig() { //保存配置 Dictionary<string, string> PrintConfigDIC = new Dictionar ...

  4. vue 路由守卫

    router.beforeEach((to, from, next) => { const nextRoute = [ 'login']; var token = window.localSto ...

  5. git+webpack项目初始化<一>

    目录结构 src + page view image service util git初始化 linux常用命令 rm -rf mmall-fe/ 删除 mkdir mmall-fe 创建文件夹 ls ...

  6. 编译原理 #01# 简易词法分析器(js实现)

    // 实验存档 效果图: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  7. Spark大型电商项目实战-及其改良(4) 单独运行程序发现的问题

    之前的运行结果比对发现,有1个函数的作用在2个job里面是相同的,但是对应的计算时间却差太远 于是把4个job分开运行.虽说使用的数据不同,但是生成数据的生成器是相同的,数据排布差距不大,数据量也是相 ...

  8. 基于OpenCV做“三维重建”(1)--找到并绘制棋盘

    <OpenCV计算机视觉编程攻略(第3版)>这套书已经出到第3版了,如果你非要我说这本书有多好,我说不出来:只是很多我第一手的例子都是来源于这本书的-相比较OpenCV官方提供的代码,这本 ...

  9. Navicat Premium 12

    1.win 客户端软件下载: https://www.navicat.com.cn/download/navicat-premium 2.安装 双击安装--点击下一步 我同意--下一步 选择安装路径- ...

  10. Tomcat配置文件入门

    转自:http://blog.csdn.net/jubincn/article/details/4856293 Tomcat 基本配置 tomcat读取配置文件 首先简单说一下tomcat是如何读取配 ...