算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。
输入样例:
,+ + 2 * 3 - 7 4 / 8 4
输出样例:
13.0
思路:从后往前扫描,遇到数字则入栈,遇到操作符则对栈顶的俩个元素进行运算,再将运算结果压入栈中
特殊情况:负数,小数,若除数为0,则打印ERROR
以下是ac代码:
#include <iostream>
#include<cmath>
#include<algorithm>
using namespace std;
typedef struct SNode * Stack;
struct SNode
{
double *Data;
int top;
int maxsize;
};
Stack CreatStack(int maxsize);
bool IsEmpty(Stack s);
bool IsFull(Stack s);
bool Push(Stack s, double X);
double Pop(Stack s);
/*+ -1.3 * 1.2 1.2*/
int main()
{
string str;
getline(cin, str);
double num = 0.0;
Stack s;
int cnt = 0;
int mul = 1;
double x, y, result;
bool flag = true;
s = CreatStack(300);
for(int i = str.size() - 1; i >= 0; i--)
{
if(isdigit(str[i])){//当前字符是数字字符
num = str[i] - '0';
mul = 10;//当前数字在什么位数上(个位:1,十位:2)
for(i-- ; i >= 0; i--)
{
if(isdigit(str[i])){//当前字符是数字
num = num + mul * (str[i] - '0');
mul *= 10;//位数+1
}
else if(str[i] == '-')
num = -num;
else if(str[i] == '.'){
num = num / mul;//如1.23, num = 23, mul = 100,遇到',' 23要变成0.23
mul = 1;
}
else
break;
}
Push(s, num);
num = 0;
mul = 1;
}
else if(str[i] != ' ')
{
x = s->Data[s->top];//取栈顶元素
Pop(s);
y = s->Data[s->top];//取栈顶元素
Pop(s);
if(str[i] == '+')//判断运算符,进行运算
result = x + y;
else if(str[i] == '-')
result = x - y;
else if(str[i] == '*')
result = x * y;
else
{
if(y == 0)
{
printf("ERROR\n");
return 0;
}
result = x * 1.0 / y;
}
Push(s, result);//将运算结构压入栈中
}
}
if(num != 0)
Push(s, num);
printf("%.1f", s->Data[s->top]);
return 0;
}
Stack CreatStack(int maxsize)
{
Stack s;
s = (Stack)malloc(sizeof(struct SNode));
s->Data = (double * )malloc(maxsize * sizeof(double));
s->maxsize = maxsize;
s->top = -1;
return s;
}
bool IsEmpty(Stack s)
{
return (s->top == -1);
}
bool IsFull(Stack s)
{
return(s->top == s->maxsize - 1);
}
bool Push(Stack s, double X)
{
if(IsFull(s))
return false;
else
{
s->Data[++s->top] = X;
return true;
}
}
double Pop(Stack s)
{
if(IsEmpty(s))
{
return false;
}
else
{
return s->Data[s->top--];
}
}