华为笔试题
2020-07-12 本文已影响0人
UAV
x#y=2x+3y+4
x优先级高于#
7#6$5#12
=7#(36+5+2)#12
=7#25#12
=(27+325+4)#12
=93#12
=293+3*12+4
=226
思路
1,字符串切割,将字符串中的数字和符号分离压入vector中
2,找出有几个运算符有限级高的符号'$'.
3.先运算优先级高的'$',在运算优先级低的'#'
#include<vector>
int main() {
vector<char>data;
vector<char>symbal;
string str = "";
while (cin >> str)
{
/*
x#y=2*x+3*y+4
x$y=3*x+y+2
$优先级高于#
7#6$5#12
=7#(3*6+5+2)#12
=7#25#12
=
*/
//1.先遍历字符串,将结果压入vector中
vector<int>data;
vector<char>symbal;
//1.将数字、字符压入vector中。
string tmp_data = "";
for (int i = 0; i < str.size(); i++)
{
//当前是数字,下一个是否为数字。如果不是数字结束。
if ('0' <= str[i] && str[i] <= '9') {
//数字是最后一个
if (i + 1 == str.size()) {
tmp_data+= str[i];
//cout << "最后一个数字:" << tmp_data << endl;
data.push_back(stoi(tmp_data));
}
//下一个是数字
if ((i + 1 < str.size()) && '0' <= str[i + 1] && str[i + 1] <= '9') {
tmp_data += str[i];
}
//下一个是符号
if ((i + 1 < str.size()) && (str[i+1] == '$' || str[i+1] == '#')) {
tmp_data += str[i];
//cout << "打印数字:" << tmp_data << endl;
data.push_back(stoi(tmp_data));
tmp_data="";
}
}//是符号
else
{
symbal.push_back(str[i]);
}
}
//2.统计有多少个$并进行计算
int total_befor = 0;
for (int i = 0; i <symbal.size(); i++)
{
if (symbal[i] == '$') {
total_befor++;
}
}
for (int k = 0; k < total_befor; k++)
{
//先判断有几个处理优先级高的$
for (int i = 0; i <symbal.size(); i++)
{
//优先级高的符号
if (symbal[i] == '$') {
//计算
//x$y = 3 * x + y + 2
int tmp_data = 3 * data[i] + data[i + 1] + 2;
data.erase(data.begin() + i);
data[i] = tmp_data;
symbal.erase(symbal.begin() + i);
break;
}
}
}
//x#y=2*x+3*y+4
int length = symbal.size();
for (int m = 0; m < length; m++)
{
for (int i = 0; i < length; i++)
{
int tmp=2 * data[0] + 3 * data[1] + 4;
symbal.erase(symbal.begin());
data.erase(data.begin());
data[0]=tmp;
break;
}
}
//打印符号和数字
for (int i = 0; i < data.size(); i++)
{
cout << data[i]<<" ";
}
cout << endl;
//for (int i = 0; i <symbal.size(); i++)
//{
// cout << symbal[i]<<" ";
//}
//cout << endl;
system("pause");
}
}