华为历年试题(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;
}

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

时间: 2024-10-22 06:17:41

华为历年试题(9字符串计算器)的相关文章

华为历年试题(字符串1)

1.字符串问题 问题描述: 把一个字符串中的除大写字母.小写字母和数字字符之外的其他字符都去掉,输出新字符串. 要求实现函数: void my_string(char* input, char* output) [输入]  char* input,输入的字符串 [输出]  char* output, 输出的字符串 [返回]  无 示例 输入:input = “A*(BC&De+_fg/*” 输出:output = “ABCDefg” 输入:input = “aB+_9” 输出:output =

华为历年试题(字符串2)

题目描述: 输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母, 若原始大写字母为V-Z, 则转换为对应小写字母的值减21. 其他字符不变,输出转换后的字符串. 例如,对于字母A,则转换为小写字母f:若形参是字母W,则转换为小写字母b 要求实现函数: void TransferString(const char * pInputStr, long lInputLen, char * pOutputStr); [输入] pInputStr:  输入字符串 lInputLen:  输入

华为历年试题(5)

将一个字符串的元音字母复制到另一个字符串,并排序(30分) 问题描述:有一字符串,里面可能包含英文字母(大写.小写).数字.特殊字符,现在需要实现一函数, 将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序 (小写的元音字母在前,大写的元音字母在后,依次有序). 说明:1.  元音字母是a,e,i,o,u,A,E,I,O,U. 2.  筛选出来的元音字母,不需要剔重:最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序. 要求实现函数:vo

华为历年试题(手机号合法性判断4)

手机号码合法性判断 问题描述:我国大陆运营商的手机号码标准格式为: 国家码+手机号码,例如:8613912345678. 特点如下:1.  长度13位: 2.  以86的国家码打头: 3.  手机号码的每一位都是数字.请实现手机号码合法性判断的函数 (注:考生无需关注手机号码的真实性, 也就是说诸如86123123456789这样的手机号码,我们也认为是合法的), 要求:1)  如果手机号码合法,返回0: 2)  如果手机号码长度不合法,返回1 3)如果手机号码中包含非数字的字符,返回2: 4)

华为历年试题(单词统计3)

单词统计 题目描述: 输入一段英文文本,用程序统计出现频率最高和最低的两个单词; 英文文本中仅出现这四类字符:空格( ).英文逗号(,).英文句号(.).英文大小写字母(a-z.A-Z) 单词之间的分隔符仅考虑这三种:空格( ).英文逗号(,).英文句号(.); 仅大小写不同的单词算同一个单词: 如果两个单词出现次数相同,则在文本中首次出现的单词优先返回. 返回的单词统一用小写字母返回 例如: 输入字符串“Hello world, i said hello world to the world”

华为历年试题(掷骰子游戏 7)

问题描述: 在掷骰子游戏中,会根据所掷数字在地图中前进几步,前进完成后需要根据当前地图位置所示的障碍进行相应操作,其中障碍表示: 1)  9:无障碍 2)  1:停掷一轮,即下轮所掷数字无效: 3)  2:后退两步,如果已经到起点不再后退: 4)  3:奖励前进一步 如果在游戏过程中,已经走到地图终点,则游戏结束.根据输入的地图数组,和5个骰子数的数组,返回最终玩家前进了多少步. 要求实现函数: void dice(int map_len, int* map, int* dice_val, in

华为历年试题(10约瑟夫环)

约瑟夫环形问题 有30人将其编号,从头开始1,2,3数数,每到3将其删除,一共删去15个数.输出被删去的15个数 #include<iostream> using namespace std; struct LinkList { int val; LinkList* next; LinkList(int a):val(a),next(NULL){} }; LinkList *CreatList(int n) { LinkList *p = new LinkList(1); LinkList *

华为历年试题(数组8)

有一个数组a[N]如a[10]={0,1,2,3,4,5,6,7,8,9} 每隔两个数删除一个数,如0,1,2(删除),3,4,5(删除),6,7,8(删除),9, 到数组尾部回到数组头部继续删除,要求编写一个函数实现实现上述操作, 返回最后一个数的数组下标. 函数接口:int getLast(int iLen) 参数:数组初始元素个数iLen #include<iostream> using namespace std; struct LinkP{ int val; LinkP *next;

华为机试题之字符串压缩问题

通过键盘输入一串小写字母(a~z)组成的字符串.                     请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,                     并输出压缩后的字符串.                       压缩规则:  1. 仅压缩连续重复出现的字符.比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".               2. 压缩字段的格式为"字符重复的次数+字