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