C++实现中缀表达式转前、后缀
#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++实现中缀表达式转前、后缀的更多相关文章
- [Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)
题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535 Descripti ...
- javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...
- 【java】中缀表达式转后缀表达式 java实现
算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...
- [LeetCode] 由 “中缀表达式 --> 后缀表达式" 所想
如何利用栈解决问题. Ref: 如何在程序中将中缀表达式转换为后缀表达式? 本文的引申:如何手写语法分析器 实现调度场算法 “9+(3-1)*3+10/2” --> “9 3 1-3*+ 10 ...
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- ACM题目————中缀表达式转后缀
题目描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符在两 ...
- 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)
定义: 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 后缀表达式: 又叫逆波兰表达式 ,不包含括号,运算符放在两个运算对象的后面,所有的计算 ...
- NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )
郁闷的C小加(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...
- hdu-1237 简单计算器---中缀表达式转后缀表达式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 思路 ...
随机推荐
- 推荐一个很好用的HTTP操作类
/// <summary> /// 类说明:HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提示 ...
- php三中页面跳转方式(header、location、refresh) 乐杨俊
反法三:也是用的比较多的
- 关于国产跨平台的开源游戏引擎LGame
声明: 本博客文章原创类别的均为个人原创,版权所有.转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com. ...
- 解决Eclipse一直loading workbench无法启动的问题
不知怎地,Eclipse始终停留在Loading workbench状态.反复重启,状态依旧.尝试解决. 停止时显示的状态:”Loading workbench”,看来和这个workbench插件有关 ...
- VS2012下基于Glut OpenGL glScissor示例程序:
剪裁测试用于限制绘制区域.我们可以指定一个矩形的剪裁窗口,当启用剪裁测试后,只有在这个窗口之内的像素才能被绘制,其它像素则会被丢弃.换句话说,无论怎么绘制,剪裁窗口以外的像素将不会被修改.有的朋友可能 ...
- [ios2]ios系统中各种设置项的url链接
在代码中调用如下代码:(ps: ios 5.0 以后不可用)NSURL*url=[NSURL URLWithString:@"prefs:root=WIFI"];[[UIAppli ...
- php钩子程序设计
序 作为程序员,设计出优雅而完美的系统,永远是让我们非常兴奋的事情.高手不在于你会多少语言,而在于你有多高的思想. 在设计中,怎么体现自身价值,那就是要比别人多想几步. 讲钩子程序,起 ...
- PostgreSQL学习手册(常用数据类型)
一.数值类型: 下面是PostgreSQL所支持的数值类型的列表和简单说明: 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer ...
- IOS数据库操作SQLite3使用详解(转)
iPhone中支持通过sqlite3来访问iPhone本地的数据库.具体使用方法如下1:添加开发包libsqlite3.0.dylib首先是设置项目文件,在项目中添加iPhone版的sqlite3的数 ...
- 遇到个奇怪的问题,同时开启本地和远程两个事务,远程事务是sql2000没问题,是sql2008的不报错,但是写不上数据
遇到个奇怪的问题,同时开启本地和远程两个事务,远程事务是sql2000没问题,是sql2008的不报错,但是写不上数据. 倒腾了4.5天,找到最终的解决办法:直接调用AdoConnection.exe ...