逆波兰法求解数学表达示(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 描述 逆波兰表达式是一种把运算 ...
随机推荐
- Spring Boot (23) Lettuce Redis
Spring Boot除了支持常见的ORM框架外,更是对常用的中间件提供了非常好的封装,随着SpringBoot2.x的到来,支持的组件也越来越丰富,也越来越成熟,其中对Redis的支持不仅仅是它丰富 ...
- 【Spring】AOP
AOP 编程允许你把遍布应用各处的功能分离出来形成可重用的组件,将安全.事务和日志关注点与你的核心业务逻辑相分离. 面向切面编程往往被定义为促使应用程序分离关注点的一项技术.系统由许多不同组件组成,每 ...
- iOS 从xib中加载自定义视图
想当初在学校主攻的是.NET,来到公司后,立马变成java开发,之后又跳到iOS开发,IT人这样真的好么~~ 天有不测风云,云还有变幻莫测哎,废话Over,let's go~ 新学iOS开发不久,一 ...
- T-SQL语句以及几个数据库引擎
创建表 注意事项: A.自增长 B.数据库引擎, ISAM 是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数.因此,IS ...
- [Windows Server 2012] Tomcat安装方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Win20 ...
- day10-函数基础知识
函数 什么是函数 把工具事先准备好,然后下次使用的时候,直接使用就行了.我们的函数就是工具 为何用函数 1.遇到重复的功能只能重复编写实现代码,代码冗余 2.功能需要扩展时,需要找出所有实现该功能的地 ...
- Redis 之sentinel运维监控
有三台redis服务器6379.6380.6381,配置6379为主服务器,6380与6381都为6379的从服务器.如果主服务器6379挂掉了,我们怎么办? 方式一:手动修改从服务器的配置,将638 ...
- Redis 之order set有序集合结构及命令详解
1.zadd key score1 value1 score2 value2 添加元素 2.zrem key value1 value2 .. 删除集合中的元素 3.zremrangebyscor ...
- 【转载】resolv.conf中search作用
原文地址:http://www.oliver.ren/linux/387.html reslov.conf中的search主要是用来补全hostname的,有时候域名太长,可以做一个短域名做主机名字, ...
- linux常用命令--ubuntu
linux 操作系统 一.linux 操作系统概述 二.安装linux系统 三.linux系统环境 ubuntu,默认有6个命令交互通道和一个图形界面交互通道,默认进入到的是图形界面通道 命令交互模式 ...