C语言计算程序 100
所谓后缀表达式,就是将a @ b写成 a b @
其中前者是我们日常生活中的中缀表达式,后面的就是后缀表达式。
例如7*8 化为 7 8 *
例如6-9 化为 6 9 -
例如5*(3+2),化成后缀表达式就是5 3 2 + *
可知后缀表达式无括号。
然后依次扫描符号,数字就直接进栈,遇到运算符就将前两个数字出栈、运算后结果再进栈:
例如5 3 2 + *
扫描5——>5
扫描3——>5 3
扫描2——>5 3 2
扫描+——>5 5
扫描*——>25
所以你现在要解决的问题是如何将中缀表达式转化成后缀表达式。
这个依然是通过栈来实现。
从左到右扫描,遇到数字直接输出,遇到符号比较优先级进栈或输出(优先级大的进栈,小的或相等的直接输出。其中左括号优先级大于乘除大于加减),遇到左括号则进栈,遇到右括号则将栈内左括号之内的符号都输出,遇到末尾就将栈内的所有符号都输出。
例如5*(3+2)
扫描5 直接输出
扫描* 进栈(栈内:*)
扫描( 进栈(站内:* ()
扫描3 直接输出
扫描+ +的优先级小于(的优先级,进栈,(栈内:* ( +)
扫描2 直接输出
扫描) 将站内(之前的全部输出,即输出了+
扫描到末尾,将栈内所有东西全部输出,即输出了*
综上,输出了5 3 2 + *
你可以看这个链接http://zhidao.baidu.com/question/552455212079542532.html?oldq=1
也是我回答的
这种用数组处理的方式好麻烦。。。如果你仅学到数组操作的话。。。
#include <iostream>
#include <cstring>
using namespace std;
int a[5];
char b[4];
void input() {
string s;
cin >> s;
int cur = 0;
int x = 0, y = 0, z = 0;
for (int i = 0; i < 5; i++) {
while (s[cur] >= '0' && s[cur] <= '9')
z = 10 * z + int(s[cur++]) - 48;
a[x++] = z;
z = 0;
if (i < 4) {
b[y++] = s[cur];
cur++;
}
}
}
int calc() {
int y = 4;
for (int i = 0; i < y; i++)
if (b[i] == '*' || b[i] == '/') {
if (b[i] == '*') a[i] *= a[i + 1];
else a[i] /= a[i + 1];
for (int j = i + 1; j < y; j++)
a[j] = a[j + 1];
for (int j = i; j < y - 1; j++)
b[j] = b[j + 1];
i = -1;
y--;
}
if (y == 0) return a[0];
for (int i = 0; i < y; i++) {
if (b[i] == '+') a[i] += a[i + 1];
else a[i] -= a[i + 1];
for (int j = i + 1; j < y; j++)
a[j] = a[j + 1];
for (int j = i; j < y - 1; j++)
b[j] = b[j + 1];
i = -1;
y--;
}
return a[0];
}
int main()
{
input();
cout << calc() << endl;
system("pause");
return 0;
}