码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-10 00:13:40      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   数据   os   art   

 

  • 问题描述:

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

注:输入的表达式字符串长度小于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; 
}

 

华为历年试题(9字符串计算器),布布扣,bubuko.com

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

标签:style   blog   color   数据   os   art   

原文地址:http://www.cnblogs.com/Xylophone/p/3811428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!