您的位置:首页 > 其它

【stack 实现前缀、后缀、中缀表达式运算】

2015-10-20 15:09 525 查看
问题一:输入一个前缀表达式,每个运算符和数字之间都有一个空格,输入的数字全为正实数。

代码实现:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <algorithm>
#define MAXN 600
using namespace std;
char str[MAXN];
void solve(char *s)
{
stack<double> S;
strrev(s);
char num[MAXN];
int t = 0;
bool flag = false;
int len = strlen(s);
for(int i = 0; i <= len; i++)
{
if(s[i] >= '0' && s[i] <= '9' || s[i] == '.')
{
flag = true;
num[t++] = s[i];
}
else if(s[i] == ' ' || s[i] == '\0')
{
if(flag)
{
num[t] = '\0';
strrev(num);//从后向前扫 碰到数字用字符串记录后,需要反转
S.push(atof(num));
t = 0;
flag = false;
}
}
else
{
double a = S.top(); S.pop();
double b = S.top(); S.pop();
double c;
switch(s[i])
{
case '+': c = a + b; break;
case '-': c = a - b; break;
case '*': c = a * b; break;
case '/': c = a / b;
}
S.push(c);
}
}
printf("%.2lf\n", S.top());
}
int main()
{
while(gets(str)){
solve(str);
}
return 0;
}


测试数据:

1
1.00
10.1234
10.12
+ 2 * + 3 4 5
37.00
+ 5.1 / 3 7
5.53


问题二:同问题一,输入一个后缀表达式,求结果。

代码实现:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <algorithm>
#define MAXN 600
using namespace std;
char str[MAXN];
void solve(char *s)
{
stack<double> S;
char num[MAXN];
int t = 0;
bool flag = false;
int len = strlen(s);
for(int i = 0; i <= len; i++)
{
if(s[i] >= '0' && s[i] <= '9' || s[i] == '.')
{
flag = true;
num[t++] = s[i];
}
else if(s[i] == ' ' || s[i] == '\0')
{
if(flag)
{
num[t] = '\0';
S.push(atof(num));
t = 0;
flag = false;
}
}
else
{
double b = S.top(); S.pop();//两数位置和前缀不一样
double a = S.top(); S.pop();
double c;
switch(s[i])
{
case '+': c = a + b; break;
case '-': c = a - b; break;
case '*': c = a * b; break;
case '/': c = a / b;
}
S.push(c);
}
}
printf("%.2lf\n", S.top());
}
int main()
{
while(gets(str)){
solve(str);
}
return 0;
}


测试数据:

1
1.00
10.1234
10.12
2 3 4 + 5 * +
37.00
5.1 3 7 / +
5.53


问题三:求解中缀表达式,要求同问题一。

暂时看这个吧   点我  抽空补上新代码     现在要写数据结构实验了
╮(╯▽╰)╭ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: