#include<iostream>
#include<string>
#include<stack>
using namespace std;
bool isInt(char ch)
{
if(ch>='0'&&ch<='9')
return true;
return false;
}
bool isOperator(char ch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
return true;
return false;
}
int opLevel(char ch)
{
int level;
switch(ch)
{
case'+':
case'-':
level=1;
break;
case'*':
case'/':level=2;
break;
default:
level=0;
break;
}
return level;
}
/*中缀-->前缀 算法
1)求输入串的逆序。
2)检查输入的下一元素。
3)假如是操作数,把它添加到输出串中。
4)假如是闭括号,将它压栈。
5)假如是运算符,则
i)假如栈空,此运算符入栈。
ii)假如栈顶是闭括号,此运算符入栈。
iii)假如它的优先级高于或等于栈顶运算符,此运算符入栈。
iv)否则,栈顶运算符出栈并添加到输出串中,重复步骤5。
6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。
7)假如输入还未完毕,跳转到步骤2。
8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。
9)求输出串的逆序。
*/
string priOrder(string myStr)
{
stack<char> opStack;
string result;
for(int i=myStr.length()-1; i>=0; i--)
{
char ch=myStr[i];
if(isInt(ch))
{
result.push_back(ch);
}
else if(')'==ch)
{
opStack.push(ch);
}
else if(isOperator(ch))//操作符
{
while(true)
{
if(opStack.empty()||opStack.top()==')'||(opLevel(ch)>=opLevel(opStack.top())))
{
opStack.push(ch);
break;
}
else
{
result.push_back(opStack.top());
opStack.pop();
}
}
}
else if('('==ch)
{
while(opStack.top()!=')')
{
result.push_back(opStack.top());
opStack.pop();
}
opStack.pop();
} }
while(!opStack.empty())
{ result.push_back(opStack.top());
opStack.pop(); }
return result; }
/*中缀-->后缀 算法
*/
string postOrder(string myStr)
{
string result;
stack<char> opStack;
for(int i=0; i<myStr.length(); i++)
{
char ch=myStr[i];
if(isInt(ch))
{
result.push_back(ch);
}
else if('('==ch)
{
opStack.push(ch);
}
else if(isOperator(ch))
{
while(true)
{
if(opStack.empty()||opStack.top()=='('||opLevel(ch)>=opLevel(opStack.top()))
{
opStack.push(ch);
break;
}
else
{
result.push_back(opStack.top());
opStack.pop();
}
}
}
else if(')'==ch)
{
while(opStack.top()!='(')
{
result.push_back(opStack.top());
opStack.pop();
}
opStack.pop();
} }
while(!opStack.empty())
{
result.push_back(opStack.top());
opStack.pop();
}
return result;
}
int main()
{
string myStr;
cin>>myStr;
string result;
result=priOrder(myStr);
for(int i=result.length()-1; i>=0; i--)
{
cout<<result[i];
}
cout<<endl;
result=postOrder(myStr);
for(int i=0; i<=result.length(); i++)
{
cout<<result[i];
}
return 0;
}

  

C++实现中缀表达式转前、后缀的更多相关文章

  1. [Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)

    题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535     Descripti ...

  2. javascript使用栈结构将中缀表达式转换为后缀表达式并计算值

    1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...

  3. 【java】中缀表达式转后缀表达式 java实现

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

  4. [LeetCode] 由 “中缀表达式 --> 后缀表达式" 所想

    如何利用栈解决问题. Ref: 如何在程序中将中缀表达式转换为后缀表达式? 本文的引申:如何手写语法分析器 实现调度场算法 “9+(3-1)*3+10/2” --> “9 3 1-3*+ 10 ...

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

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

  6. ACM题目————中缀表达式转后缀

    题目描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符在两 ...

  7. 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)

    定义: 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 后缀表达式: 又叫逆波兰表达式 ,不包含括号,运算符放在两个运算对象的后面,所有的计算 ...

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

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

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

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

随机推荐

  1. JSTL(JSP Standard Tag Library ,JSP标准标签库)

    JSTL标签之核心标签   JSTL(JSP Standard Tag Library ,JSP标准标签库)是一个实现 Web应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断.数据管 ...

  2. C# ASP.net 入门之简单通讯录

    简单通讯录功能虽然简单,却包括了制作一个网站的基本功能!各个模块可以作为新手入门的参考. 简单通讯录实现功能:1.登录 2.注册 3.后台管理 4.前台登录显示 5.创建联系人 6.密码修改 代码下载 ...

  3. Ecshop出现问题 includes\lib_main.php on line 1329 includes\lib_base.php on line

    php 5.3版本兼容问题不少,以上函数参数传递问题可以将lib_main.php on line 1329这句 $ext = end(explode('.', $tmp)); 改为 : $extsu ...

  4. 《Django By Example》第六章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:无他,祝大家年会都中奖!) 第六章 ...

  5. LightOJ 1248 Dice (III)

    期望,$dp$. 设$dp[i]$表示当前已经出现过$i$个数字的期望次数.在这种状态下,如果再投一次,会出现两种可能,即出现了$i+1$个数字以及还是$i$个数字. 因此 $dp[i]=dp[i]* ...

  6. Web API 2中的Action Results

    [译]Action Results in Web API 2 单击此处查看原文 本文阐述了ASP.NET Web API是如何将controller action的返回值转换为HTTP respons ...

  7. maven自定义骨架

    Maven 的 archetype 技术,为新建标准化的工程框架提供了方便.为自定义一套工程框架标准,可参考以下步骤操作: 1,创建一个项目的原型 2,在项目根目录执行命令:mvn archetype ...

  8. Oracle怎么更改用户名和密码

    通过修改ORACLE基表的方式来修改用户名直接修改底层表USER$更改用户名(该方法在Oracle9i,Oracle10g中测试通过)SQL> UPDATE USER$ SET NAME='TT ...

  9. jquery通过attr取html里自定义属性原来这么方便啊

    <script type="text/javascript"> function fangGouWuChe(obj) { //放入购物车  var sMat = $(o ...

  10. jquery ColorPicker 颜色选择器

    $(function() { $('#colorpickerField').ColorPicker({ onSubmit: function(hsb, hex, rgb, el) { $(el).va ...