您的位置:首页 > 职场人生

美团面试题 输入任意表达式输出结果

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: