#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. sqlserver生成随机数 2011-12-21 15:47 QQ空间

    -创建视图 create view myview as select re=rand() --自定义函数:取得指定范围的随机数 create function mydata( @a int, @b i ...

  2. python手记(11)

    <form method="POST" action="http://host.com/cgi-bin/test.py"> <p>You ...

  3. 作为IT行业计算机从业人士,不要做“邻居盖新房,你就是背后放火的那种人”

    金华-普通人(214103872)  21:03:01 尽扯蛋   颇有点凤姐的营销方式  横瓜(601069289)  21:05:16 不服气 你搞一个下面的类似软件出来 http://www.s ...

  4. 深入学习Java中的字符串,代码点和代码单元

    在Java字符串处理时,在使用length和charAt方法时,应该格外小心,因为length返回的是UTF-16编码表示下的代码单元数量,而非我们所认为的字符的个数,charAt方法返回的是指定位置 ...

  5. 使用 IDEA 创建 Maven Web 项目 (二)- 搭建 WEB 项目框架

    转为 Java Web 项目 将上一节中创建的 Maven 项目调整为 WEB 项目结构,步骤如下: 在 main 目录下,添加 webapp 目录. 在 webapp 目录下,添加 WEB-INF ...

  6. 前端工具 - 15个最佳的 JavaScript 表单验证库

    客户端验证在任何项目都是不够的,因为 JavaScript 可以直接忽略,人们可以提交请求到服务器. 然而这并不意味着客户端验证都没必要了,很多时候我们需要在用户提交到服务器之前给予提示.JavaSc ...

  7. 间隔Ns请求某函数并且有timeout

    实现方案: 1. 递归调用 2.timer:apply_interval() 3.gen_server来写 时间timeout怎么实现: 1.开始时间存入ets表中 2.put,get方法放入进程字典 ...

  8. 安装Java Cer证书

    skldfsdf  Javaawtetwetwetwetwe testse Java estestset

  9. 关于mysql严格模式的开启、关闭

    由于项目中对一些默认值设置问题,以及种种原因,mysql数据库需要使用非严格模式开发(mysql最近的版本默认是开启严格模式的). linux下mysql服务下操作步骤是: 1.进入mysql服务   ...

  10. Linux 中 sudo、su命令

    sudo : 暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码,而不是超级账户的密码.不过有时间限制,Ubuntu默认为一次时长15分钟.su : 切换到某某用户模式,提 ...