美团面试题 输入任意表达式输出结果
2015-09-18 22:11
218 查看
表达式中包括+,-, *,/ ,(, ) 和空格
算法思路:
1: 去掉表达式中的括号,将表达式转化为后缀表达式
栈中保存运算符和括号
1) ‘-’ ‘+’ :如果栈顶元素为'(', 压入栈中,否则放入后缀表达式
2) ' ': ++i;
3) '*' '/' : 如果栈顶元素不为‘(’,且栈顶元素为‘*’ 或‘/’ 弹出栈顶元素放入后缀表达式,否则压入栈中
4) ‘0’ ~ ‘9’ : 放入后缀表达式,如果下一个元素不是数字,还放入‘#‘到后缀表达式,作为数字结束标志
2:计算后缀表达式
#include<iostream>
#include<string>
#include<stack>
using namespace std;
void TransformExpr(char *oldexpr,char *newexpr)
{
stack<char> s;
int i=0;
int j=0;
while(oldexpr[i] != '\0')
{
switch(oldexpr[i])
{
case '(' :
s.push(oldexpr[i++]);
break;
case '+':
case '-':
while(s.size()>0 && s.top() != '(')
{
newexpr[j++] = s.top();
s.pop();
}
s.push(oldexpr[i++]);
break;
case '*':
case '/':
while(s.size()>0 && s.top() != '(' && (s.top() == '*' || s.top() == '/'))
{
newexpr[j++] = s.top();
s.pop();
}
s.push(oldexpr[i++]);
break;
case ')':
while(!s.empty())
{
char temp = s.top();
s.pop();
if(temp != '(')
{
newexpr[j++] = temp;
}
else
{
++i;
break;
}
}
break;
case ' ':
++i;
break;
default :
while(oldexpr[i] >= '0' && oldexpr[i] <= '9')
{
newexpr[j++] = oldexpr[i];
++i;
}
newexpr[j++] = '#';
break;
}
}
while(!s.empty())
{
newexpr[j++] = s.top();
s.pop();
}
newexpr[j] = '\0';
}
int Calculate(char *expr)
{
int i=0;
stack<int> data;
int tmp;
while(expr[i] != '\0')
{
tmp = 0;
if(expr[i] >= '0' && expr[i] <= '9')
{
while(expr[i] >= '0' && expr[i]<='9')
{
tmp = tmp * 10 + expr[i++] - '0';
}
data.push(tmp);
}
else if(expr[i] == '#')
++i;
else
{
int a,b;
a= data.top();
data.pop();
b= data.top();
data.pop();
switch(expr[i++])
{
case '+':
tmp = b+a;
data.push(tmp);
break;
case '-':
tmp = b-a;
data.push(tmp);
break;
case '*':
tmp = a*b;
data.push(tmp);
break;
case '/':
tmp = b/a;
data.push(tmp);
break;
}
}
}
return data.top();
}
int main()
{
char expr[] = "22+(1+2*3+2)/(1+1*2)";
char newexpr[100];
TransformExpr(expr,newexpr);
cout<<newexpr<<endl;
cout<<Calculate(newexpr)<<endl;
return 0;
}
运算结果:
22#1#2#3#*+2#+1#1#2#*+/+
25
算法思路:
1: 去掉表达式中的括号,将表达式转化为后缀表达式
栈中保存运算符和括号
1) ‘-’ ‘+’ :如果栈顶元素为'(', 压入栈中,否则放入后缀表达式
2) ' ': ++i;
3) '*' '/' : 如果栈顶元素不为‘(’,且栈顶元素为‘*’ 或‘/’ 弹出栈顶元素放入后缀表达式,否则压入栈中
4) ‘0’ ~ ‘9’ : 放入后缀表达式,如果下一个元素不是数字,还放入‘#‘到后缀表达式,作为数字结束标志
2:计算后缀表达式
#include<iostream>
#include<string>
#include<stack>
using namespace std;
void TransformExpr(char *oldexpr,char *newexpr)
{
stack<char> s;
int i=0;
int j=0;
while(oldexpr[i] != '\0')
{
switch(oldexpr[i])
{
case '(' :
s.push(oldexpr[i++]);
break;
case '+':
case '-':
while(s.size()>0 && s.top() != '(')
{
newexpr[j++] = s.top();
s.pop();
}
s.push(oldexpr[i++]);
break;
case '*':
case '/':
while(s.size()>0 && s.top() != '(' && (s.top() == '*' || s.top() == '/'))
{
newexpr[j++] = s.top();
s.pop();
}
s.push(oldexpr[i++]);
break;
case ')':
while(!s.empty())
{
char temp = s.top();
s.pop();
if(temp != '(')
{
newexpr[j++] = temp;
}
else
{
++i;
break;
}
}
break;
case ' ':
++i;
break;
default :
while(oldexpr[i] >= '0' && oldexpr[i] <= '9')
{
newexpr[j++] = oldexpr[i];
++i;
}
newexpr[j++] = '#';
break;
}
}
while(!s.empty())
{
newexpr[j++] = s.top();
s.pop();
}
newexpr[j] = '\0';
}
int Calculate(char *expr)
{
int i=0;
stack<int> data;
int tmp;
while(expr[i] != '\0')
{
tmp = 0;
if(expr[i] >= '0' && expr[i] <= '9')
{
while(expr[i] >= '0' && expr[i]<='9')
{
tmp = tmp * 10 + expr[i++] - '0';
}
data.push(tmp);
}
else if(expr[i] == '#')
++i;
else
{
int a,b;
a= data.top();
data.pop();
b= data.top();
data.pop();
switch(expr[i++])
{
case '+':
tmp = b+a;
data.push(tmp);
break;
case '-':
tmp = b-a;
data.push(tmp);
break;
case '*':
tmp = a*b;
data.push(tmp);
break;
case '/':
tmp = b/a;
data.push(tmp);
break;
}
}
}
return data.top();
}
int main()
{
char expr[] = "22+(1+2*3+2)/(1+1*2)";
char newexpr[100];
TransformExpr(expr,newexpr);
cout<<newexpr<<endl;
cout<<Calculate(newexpr)<<endl;
return 0;
}
运算结果:
22#1#2#3#*+2#+1#1#2#*+/+
25
相关文章推荐
- 黑马程序员——函数与数组:精打细算的年级组长的利器
- 黑马程序员-Java基础学习-IO流
- 黑马程序员-------正则表达式
- 黑马程序员-----------异常
- Android面试准备:自定义控件
- 黑马程序员-Java基础学习-正则表达式
- 黑马程序员----内部类
- 第一次面试知识点总结
- 黑马程序员-----面向对象
- 黑马程序员-----------static关键字
- java程序员
- 职场新人完全转型七大要素
- 我的求职路
- 野生程序员的故事
- 黑马程序员_java基础_多线程
- 面试题用两个栈构造一个队列和用两个队列构造一个栈
- 黑马程序员---Java基础---多线程
- 面试经之一道淘汰85%面试者的百度开发者面试题
- 【转】测试职业思考:如何成为一名优秀的软件测试工程师
- 创新工场2016校园招聘 面试