NYOJ 35 表达式求值
本题是求算数表达式的值。操作数是大于等于的实数,操作符有 + ,- ,*,/,()只要开两个栈,一个记录操作符,一个记录后缀表达式。
即:把原始的中缀表达式转换成后缀表达式(逆波兰式),然后进行计算。
前缀和后缀表示法有三项公共特征:
操作数的顺序与等价的中缀表达式中操作数的顺序一致
不需要括号
操作符的优先级不相关
中缀转化为后缀算法:
a. 得到一操作符或操作数;
b. 若输入为操作数,则输出到数组,转a;
c. 若输入为‘(’,压栈,转a;
d. 若输入为‘)’,栈顶出栈,输出到数组,直至栈顶为‘(’,不输出到数组(抛弃),转a;
e. 若输入为操作符,
若栈空或栈顶为‘(’或操作符.忧先级大于栈顶操作符,压栈,转a
若操作符优先级小于栈顶操作符,则出栈,输出至数组,转e;
d. 若输入结束,出栈,输出到数组,直至栈空。
[cpp]
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <string>
using namespace std;
int priority[100];
//初始化操作符优先级
void initPri()
{
priority['('] = 1;
priority['+'] = 2;
priority['-'] = 2;
priority['*'] = 3;
priority['/'] = 3;
}
//a是符号栈顶,b是当前判断符号
//a>=b,返回true;a<b,返回false
bool judgeOpePri(char a,char b)
{
return priority[a] >= priority[b] ? true : false;
}
//两个参数:中缀表达式,生成的后缀表达式
void convert(string infixExp,stack<string> &postfixExp)
{
//运算符栈
stack<char> opS;
//临时操作数
string digitTemp;
//临时操作符
string operTemp;
int len = infixExp.length();
bool hasDigit = false;
//过滤掉'='
for(int i=0; i<len-1;)
{
//如果是操作数的一部分
while((isdigit(infixExp[i]) || infixExp[i] == '.') && i<len-1)
{
hasDigit = true;
digitTemp.push_back(infixExp[i]);
i++;
}
if(hasDigit == true)
{
postfixExp.push(digitTemp);
digitTemp = "";
hasDigit = false;
}
else
{
//如果操作符栈是空的,就入栈
if(opS.empty())
{
opS.push(infixExp[i]);
i++;
}
//注意对于'('同等优先级是不起作用的
else if(infixExp[i] == '(')
{
opS.push(infixExp[i]);
i++;
}
//弹出"()"之内的所有运算符
else if(infixExp[i] == ')')
{
while(!opS.empty())
{
char c = opS.top();
operTemp = "";
operTemp.push_back(c);
opS.pop();
if(c == '(')
{
break;
}
else
{
postfixExp.push(operTemp);
}
}
i++;
}
//操作符栈顶的优先级大
else if(judgeOpePri(opS.top(),infixExp[i]) == true)
{
char c = opS.top();
operTemp = "";
operTemp.push_back(c);
opS.pop();
postfixExp.push(operTemp);
//注意此时不要i++,因为还要继续比较
}
//操作符栈顶的优先级小
else
{
opS.push(infixExp[i]); &nbs
补充:软件开发 , C++ ,
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊