浙大PTA求前缀表达式的值

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如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--];
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值