首页 > 代码库 > 华为历年试题(9字符串计算器)

华为历年试题(9字符串计算器)

 

  • 问题描述:

在软件园开饭店的小明最近很郁闷,经常在进行账目核查时出错,每次的计算结果总是有偏差。小王知道后打算为小明解决这个问题,经过调查发现,问题出现在计算器上,当前的计算器计算方法大部分是:输入数据,输入运算符,再输入数据,立刻给出计算结果,然后不断循环。当计算结束时,如果出现偏差或者数据,无法回顾查看到底是哪一步出错,如果需要再次核查,还需要再全部输入一次,非常耽误时间。小王打算帮老板设计一种新的计算器,能够支持表达式的计算,由于是第一个版本,只需要支持整数的“+,-,*”和“( )”即可, 当然括号内的运算优先级高于括号外,“*”的优先级是高于“+,-”的。

注:输入的表达式字符串长度小于20。且表达式一定是合法的表达式。

  • 要求实现函数:

void calculate(char* input, int* rel)

【输入】  char *input,待计算的表达式

【输出】  int* rel,计算结果

【返回】  无

  • 示例

1)  输入:input = 5+2-10*2+5

输出:rel = -8

 

 

编程思想:

遇到括号就把括号中的数利用利用stack2计算。对于算术运算题一般都借助于stack来找到两个括号之间的数进行计算。

#include<iostream>#include<stack>#include<sstream>#include<stack>using namespace std;void calculate(char* input, int* rel){        unsigned len = strlen(input);    string s(input,input+len);    s.insert(len,")");    s.insert(0,"(");    len += 2;    stack<string> stack1,stack2;        for(unsigned i=0;i<len;)    {      if(s[i]==(||s[i]==*||s[i]==-||s[i]==+)      {         string s1(s,i,1);         stack1.push(s1);         i++;      }      else if(s[i]>=0 && s[i]<=9)//因为有可能传入的数大于9,是两位数或者3位数      {         unsigned start = i;         i++;         while(s[i]>=0 && s[i]<=9)             i++;         unsigned end = i;         string s1(s,start,end-start);         stack1.push(s1);      }      else if(s[i]==))//把括号内的数从stack1中pop出来,借助stack2算出来,将结果push进stack1      {        i++;   //i指向s中下一个要放入stack1的字符        while(stack1.top()!="(")//把stack1中"("之前的数取出来,取的过程中消除“*”号,把取出来的数放到stack2中        {                        if(stack1.top()!="*")            {              stack2.push(stack1.top());              stack1.pop();            }            else                         //如果遇到"*",把string转换成int计算出结果,再转成string放到stack2里            {              stack1.pop();  //pop掉"*"              string b = stack2.top();              string a = stack1.top();              stack1.pop();              stack2.pop();              int d1,d2;              istringstream is1(a),is2(b);              is1>>d1;              is2>>d2;              int res = d1*d2;              ostringstream os;              os<<res;              string re = os.str();              stack2.push(re);            }        }//end while        stack1.pop();//pop掉"("              while(!stack2.empty())//把stack2里面的数计算完清空,把结果压入stack1里面        {            if(stack2.size()==1)            {                stack1.push(stack2.top());                stack2.pop();                break;            }                       string a = stack2.top();//取出第一个操作数a            stack2.pop();           string f = stack2.top();  //"+" 或者 "-"           stack2.pop();           string b = stack2.top();//取出第二个操作数b           stack2.pop();           int d1,d2;           istringstream is1(a),is2(b);           is1>>d1;           is2>>d2;           int res;           if(f=="+")               res = d1+d2;           else               res = d1-d2;           ostringstream os;           os<<res;           string ress = os.str();                       stack2.push(ress);        }//end while            }//end else if    }//end for    string resss = stack1.top();    istringstream isss(resss);    isss>>(*rel);}void main(){      char *p = "(50*(1+2*3-4)+2)-8*(1+2)";    cout<<(50*(1+2*3-4)+2)-8*(1+2)<<endl;    int *rel = new int;    calculate(p, rel);    cout<<*rel<<endl; }