题目描述:实现一个计算器的功能,输入是字符串,只包含整数字符和‘+’,‘x’,‘@’三种字符运算符。'@'优先级最高,'x'次之,‘+’最低。计算表达式的值。
思路:所有表达式均有效,因此符号的个数一定比数字个数少一位。
- 用两个栈实现,一个栈存放数字,一个栈存放运算符。
- 遍历字符串,同时以运算符的优先级规律做入栈和出栈操作,若当前运算符的优先级大于运算符栈顶元素的优先级,则将该运算符入栈;反之,则弹出栈中元素进行计算,直到当前运算符优先级大于运算符栈顶元素的优先级,将当前运算符入栈。运算符出栈的过程也是计算中间结果的过程。
- 字符串遍历完毕后,若运算符栈不为空,则不断计算,最后数据栈栈顶元素为答案。
void test01(string s) {
//string s; cin >> s;
stack<char> op;
stack<long long> data;
unordered_map<char, int> prio;
prio['+'] = 1;
prio['x'] = 2;
prio['@'] = 3;
long long num = 0;
int n = s.length();
int i = 0;
for (; i < n; ) {
if (isdigit(s[i])) {
while (i < n && isdigit(s[i])) {
num = 10 * num + s[i] - '0';
++i;
}
data.push(num);
num = 0; }
else {
if (op.empty()) {
op.push(s[i]);
}
else {
while (!op.empty() && prio[s[i]] <= prio[op.top()]) {
char opt = op.top(); op.pop();
long long b = data.top(); data.pop();
if (opt == '+') {
data.top() += b;
}
else if (opt == 'x') {
data.top() *= b;
}
else {
data.top() = data.top() | (data.top() + b);
}
}
op.push(s[i]);
}
++i;
}
}
while (!op.empty()) {
char opt = op.top(); op.pop();
int b = data.top(); data.pop();
if (opt == '+') {
data.top() += b;
}
else if (opt == 'x') {
data.top() *= b;
}
else {
data.top() = data.top() | (data.top() + b);
}
}
cout << data.top() << endl;
}