逆波兰法求解数学表达示(C++)
主要是栈的应用,里面有两个函数deleteSpace(),stringToDouble()在我还有一篇博客其中:对string的一些扩展函数。
本程序仅仅是主要的功能实现,没有差错控制。
#include<iostream>
#include<stack>
#include<string>
#include<map>
#include"fstring.h" /*
*採用逆波兰表示法求解数学表达示
*1、将输入的中缀表示示转换成后缀表达示
*2、将后缀表达示进行计算得出结果
*/
using namespace std; stack<string> postOrderStr;
map<string, int> symbolPriority;
void initializationSymbol(map<string, int>& symbol)
{//定义优先级
pair<string, int> element;
element = make_pair("+", 0);
symbol.insert(element); element = make_pair("-", 0);
symbol.insert(element); element = make_pair("*", 1);
symbol.insert(element); element = make_pair("/", 1);
symbol.insert(element);
} void strToPostStack(string& str, stack<string>& postOrderStr)
{//首先将输入的数学表达示表示成后缀表达示
stack<string> auxilary;//辅助数组。用于暂时存放符号
string::iterator iter = str.begin();
string::iterator iter1 = iter;
bool flag = false;//是否遇到括号
for (; iter != str.end(); ++iter)
{
if (*iter == '+' || *iter == '-' || *iter == '*' || *iter == '/' || *iter == '(' || *iter == ')')
{
if (iter1 != iter)
{//可能会出现两个连续的符号
string subStr(iter1, iter);
//存入数字
postOrderStr.push(subStr);
}
string symbol(iter,iter+1);//符号 //按优先级存入符号。
if (*iter == '(')
{
flag = true;
auxilary.push(symbol);
}
else if (flag && *iter != ')')
{
auxilary.push(symbol);
}
else if (!flag)
{
if (auxilary.empty())
{
auxilary.push(symbol);
}
else
{
string tmp2 = auxilary.top();
while (symbolPriority[tmp2] >= symbolPriority[symbol])
{
postOrderStr.push(tmp2);
auxilary.pop();
if (auxilary.empty())
break;
tmp2 = auxilary.top();
}
auxilary.push(symbol);
}
}
else if (flag && *iter == ')')
{
string tmp1 = auxilary.top();
do{
postOrderStr.push(tmp1);
auxilary.pop();
tmp1 = auxilary.top();
} while (tmp1!="(");
auxilary.pop();
flag = false;
} //存放下一个数字起始位置
iter1 = iter+1;
}
}
string tmp5(iter1, iter);
postOrderStr.push(tmp5);
while (!auxilary.empty())
{
string tmp6 = auxilary.top();
postOrderStr.push(tmp6);
auxilary.pop();
}
} double computeFun(stack<string> postOrderStrNew)
{//溢出控制
stack<double> computeStack;//计算辅助栈
while (!postOrderStrNew.empty())
{
string tmp7 = postOrderStrNew.top();
if (tmp7 == "+" || tmp7 == "-" || tmp7 == "*" || tmp7 == "/")
{//遇到符号则取出计算辅助栈中的两个元素開始计算,并将结果压入栈中
double value1, value2, value3;
value1 = computeStack.top();
computeStack.pop();
value2 = computeStack.top();
computeStack.pop();
if (tmp7 == "+")
{
value3 = value2 + value1;
}
else if (tmp7 == "-")
{
value3 = value2 - value1;
}
else if (tmp7 == "*")
{
value3 = value2 * value1;
}
else
{
value3 = value2 / value1;
}
computeStack.push(value3);
}
else
{
double value;
//把字符转换成数值,然后压入栈中
value = stringToDouble(tmp7);
computeStack.push(value);
}
postOrderStrNew.pop();
}
return computeStack.top();
} int main()
{
initializationSymbol(symbolPriority);
string mathStr;
cout << "Please input a math string:"<<endl;
getline(cin,mathStr);
cout << "The string you input is:" << endl;
deleteSpace(mathStr);
cout << mathStr<<endl;
strToPostStack(mathStr, postOrderStr);
stack<string> postOrderStrNew;
while (!postOrderStr.empty())
{
string tmp4 = postOrderStr.top();
//cout << tmp4 << " ";
//转存到还有一个栈中就是后缀表达示了
postOrderStrNew.push(tmp4);
postOrderStr.pop();
}
cout << endl;
cout << "The compute result is:"<<computeFun(postOrderStrNew)<<endl;
return 0;
}
逆波兰法求解数学表达示(C++)的更多相关文章
- 逆波兰法(计算器)程序<无括号版>
涉及队列.栈的运用. Java中队列可以用: Queue<String> q = new LinkedList(); 来声明,其主要的方法有: poll(),peak(),offer(), ...
- LeetCode OJ:Evaluate Reverse Polish Notation(逆波兰表示法的计算器)
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- 关于利用STL栈求解四则中缀表达式以及中缀表达式转逆波兰表达式和逆波兰表达式的求解
今天总结一下栈的一个重要应用---四则数学表达式的求解 数学表达式的求解是栈的一个重要的应用,在计算机的应用中 如果求解一个四则运算表达式,我们可能会直接写一个程序例如什么printf("% ...
- javascript:逆波兰式表示法计算表达式结果
逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 - 等价于 5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...
- AC日记——逆波兰表达式 openjudge 3.3 1696
1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式 ...
- noi1696 逆波兰表达式
1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...
- codevs5164 逆波兰表达式
题目描述 Description 逆波兰表达式是一种把运算符前置的算术表达式(又叫前缀表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也 ...
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...
- OpenJudge 2694 逆波兰表达式
1.链接地址: http://bailian.openjudge.cn/practice/2694/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算 ...
随机推荐
- android中textview单行显示,多余的省略
<TextView android:id="@+id/music_title" android:layout_width="wrap_content" a ...
- [Windows Server 2008] ASP.net安装方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装ASP.n ...
- js 零碎
function具有一个属性是length,表示希望接收到的命名参数的个数.可以通过arguments获取参数.arguments.callee表示函数本身,递归时有用,也可以通过arguments. ...
- mysql有关时间是问题
mysql中有关时间的类型 date/datetime/time/timestamp/year date:表示日期的类型,格式为:“yyyy-MM-dd” dateTime:表示日期时间的类型,格式 ...
- haproxy故障处理
1. haproxy 在配置健康检查的时候,默认没有配置页面检查 ,通过端口状态来检测.后端IIS web服务开始可能 是一个站点,或者采用了基于域名的配置方式,导致目前站点停了,后端主机不能被hap ...
- C# SqlParameter 使用
//System.Data.SqlClient.SqlParameter[] sqlParameters = new System.Data.SqlClient.SqlParameter[]{ }; ...
- antiSMASH数据库:微生物次生代谢物合成基因组簇查询和预测
2017年4月28日,核酸研究(Nucleic Acids Research)杂志上,在线公布了一个可搜索微生物次生代谢物合成基因组簇的综合性数据库antiSMASH数据库 4.0版,前3版年均引用2 ...
- Random同时生成多个随机数
贴一个简单示例 public DataTable selectStuInfo() { DataTable dt = new DataTable(); dt.Columns.Add("姓名&q ...
- Python 函数 day3
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...
- php第二十节课
JSON弹窗 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...