题目链接
题目大意
完成表达式中缀表达式转换为后缀表达式,并且按照要求输出:若干个后缀表达式,第I+1行比第I行少一个运算符和一个操作数,最后一行只有一个数字,表示运算结果。
题目思路
(1)中缀表达式转为后缀表达式
(2)计算后缀表达式
细节和要求:
- 计算后缀表达式每算出一个数就输出一次。边计算边输出。
- ( i n t ) p o w ( b , a ) (int)pow(b, a) (int)pow(b,a),否则,过不了样例。
输入与输出
输入
8-(3+2*6)/5+4
输出
8 3 2 6 * + 5 / - 4 +
8 3 12 + 5 / - 4 +
8 15 5 / - 4 +
8 3 - 4 +
5 4 +
9
AC代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<list>
#include<stack>
using namespace std;
//运算符优先级
int priority(const char &ch)
{
switch (ch)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '^':
return 3;
case '(':
case ')':
return 0;
default:
return -1;
}
}
stack<char> ops;
int main(int argc, char* argv[])
{
string str;
cin >> str;
int len = str.length();
string tmp = ""; //存储后缀表达式
//1. 求得后缀表达式
for (int i = 0; i < len; ++i)
{
char c = str[i];
if (isdigit(c))
{
tmp += c;
}
else if(c == '(')
{
ops.push(c);
}
else if (c == ')')
{
while (ops.top() != '(')
{
tmp += ops.top();
ops.pop();
}
ops.pop();
}
else
{
while (ops.size() > 0 && priority(ops.top()) >= priority(c))
{
tmp += ops.top();
ops.pop();
}
ops.push(c);
}
}
while (ops.size()) {
tmp += ops.top();
ops.pop();
}
//第一次输出
for (int i = 0; i < tmp.length(); ++i)
{
cout << tmp[i] << ' ';
}
cout << endl;
list<int> link; //存储计算结果
//2. 计算后缀表达式
for (int i = 0; i < tmp.length(); ++i)
{
char c = tmp[i];
if (isdigit(c))
{
link.push_back(c - '0');
}
else
{
int a = link.back();
link.pop_back();
int b = link.back();
link.pop_back();
int ret;
switch (c)
{
case '+':
ret = b + a;
break;
case '-':
ret = b - a;
break;
case '*':
ret = b * a;
break;
case '/':
ret = b / a;
break;
case '^':
ret = (int)pow(b, a);
break;
}
link.push_back(ret);
for (list<int>::iterator it = link.begin(); it != link.end(); ++it)
{
cout << *it << ' ';
}
for (int j = i + 1; j < tmp.length(); ++j)
{
cout << tmp[j] << ' ';
}
cout << endl;
}
}
return 0;
}