//中缀转后缀
#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. TCP三次握手及TCP连接状态 TCP报文首部格式

    建立TCP连接时的TCP三次握手和断开TCP连接时的4次挥手整体过程如下图: 开个玩笑 ACK: TCP协议规定,只有ACK=1时有效,连接建立后所有发送的报文ACK必须为1 SYN(SYNchron ...

  2. HDFS的Java客户端编写

    总结: 之前在教材上看hdfs的Java客户端编写,只有关键代码,呵呵…….闲话不说,上正文. 1. Hadoop 的Java客户端编写建议在linux系统上开发 2. 可以使用eclipse,ide ...

  3. POJ滑雪

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 97172   Accepted: 36843 Description ...

  4. 2018-2019-2 20165335 《网络对抗技术》 Exp6 信息搜集与漏洞扫描

    1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具 ...

  5. Java里面使用Date.compareTo比较时间

    DateFormat dateFormat = DateFormat.getDateInstance(); Date oldTime = dateFormat.parse("2019-04- ...

  6. Vue入门:Vue环境安装

    安装环境 操作系统:Windows 10 64位 安装Node.js 1. 下载系统对应版本安装包 下载地址:https://nodejs.org/en/download/ 2. 安装 除安装地址外其 ...

  7. Gradle Repository

    // 该init.gradle文件,请保存到${USER_HOME}/.gradle/文件夹下,如:C:\Users\Administrator\.gradle allprojects { repos ...

  8. Maven Webapp项目web.xml版本记录

    web.xml 2.0版本 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3// ...

  9. Java基础学习-常量和变量

    1.常量概述     -在程序执行的过程中,其值不可以发生改变的量. 2.常量的分类     -字符串常量    用双引号括起来的内容("HelloWorld")     -整数常 ...

  10. hiho#1513 : 小Hi的烦恼 五维偏序

    hiho#1513 : 小Hi的烦恼 五维偏序 链接 hiho 思路 高维偏序用bitset,复杂度\((\frac{n^2}{32})\) 代码 #include <bits/stdc++.h ...