zoukankan      html  css  js  c++  java
  • 基于栈的中缀算术表达式求值

    #include<iostream>
    #include<string>
    #include<cstring>
    #include<iomanip>
    using namespace std;
    typedef struct StackNode *LStack;
    /*
    两个栈,一个是字符,一个是数字,
    先判断是什么字符,然后调用不同的函数
    */
    typedef struct Data {
        double number;
        char op;
    };
    struct StackNode {
        Data data;
        LStack next;
    };
    double Function(double a, double b, char op)
    {
        if (op == '+')
            return a + b;
        else
            if (op == '-')
                return b - a;
            else
                if (op == '*')
                    return b * a;
                else
                    if (op == '/')
                        return b / a;
    }
    char Judge(char a, char b)
    {
        if ((a == '('&&b == ')') || (a == '='&&b == '='))//a都为等号?
            return '=';
        else
            if (a == '(' || a == '=' || b == '(' || (a == '+' || a == '-') && (b == '*' || b == '/'))
                return '<';
            else
                return '>';
    }
    void InitStack(LStack &s)
    {
        s = NULL;
    }
    void Creat1(LStack &s, double a)//数字
    {
        LStack p = new StackNode;
        p->data.number = a;
        p->next = s;
        s = p;
    
    }
    void Creat2(LStack &s, char a)//op
    {
        LStack p = new StackNode;
        p->data.op = a;
        p->next = s;
        s = p;
    
    }
    void Pop(LStack &s)
    {
        LStack q;
        q = s;
        s = s->next;
        delete q;
    }
    double GetTop1(LStack &s)//number取栈顶元素
    {
        return s->data.number;
    }
    char GetTop2(LStack &s)//op
    {
        return s->data.op;
    }
    int  main()
    {
        string c;
        double y;
        while (1)
        {
            cin >> c;
            if (c[0] == '=')
                break;
            LStack s1, s2;
            InitStack(s1);//数字
            InitStack(s2);//运算符
            Creat2(s2, '=');
            int x = 0, e = 0, flag = 0;//??
            for (int i = 0; i < c.size(); i++)
            {
                if (c[i] >= '0' && c[i] <= '9')//还要考虑有小数点呢
                {
                    flag = 1;
                    x = x * 10 + c[i] - '0';
                    if (e)
                    {
                        e *= 10;
                    }
                }
                else
                    if (c[i] == '.')
                    {
                        e = 1;
                    }
                    else
                    {
                        if (flag)
                        {
                            if (e)
                            {
                                y = x * 1.0 / e;
                            }
                            else
                                y = x * 1.0;
                            Creat1(s1, y);
                            x = 0;
                            e = 0;
                            flag = 0;
                        }
                        while (1)
                        {
                            if (Judge(GetTop2(s2), c[i]) == '<')
                            {
                                Creat2(s2, c[i]);
                                break;
                            }
                            else
                                if (Judge(GetTop2(s2), c[i]) == '>')
                                {
                                    double a, b;
                                    a = GetTop1(s1);
                                    Pop(s1);
                                    b = GetTop1(s1);
                                    Pop(s1);
                                    char op;
                                    op = GetTop2(s2);
                                    Pop(s2);
                                    y = Function(a, b, op);
                                    Creat1(s1, y);
                                }
                                else
                                {
                                    Pop(s2);
                                    break;
                                }
    
                        }
                    }
    
            }
            cout << setiosflags(ios::fixed) << setprecision(2);
            cout << s1->data.number << endl;
        }
        return 0;
    
    }

    有一些不明白的:有小数点的部分没看明白呢。。

  • 相关阅读:
    负载均衡之加权轮询算法(转)
    go 指南学习笔记
    select限制之文件描述符限制
    select的限制
    select实现超时(套接字IO超时设置)
    如何在CentOS 8上安装Puppet
    如何在Ubuntu 20.04 / 18.04或更老版本中安装ifconfig
    关于Ubuntu的Apt安装与使用介绍
    如何在CentOS 8上安装Suricata?
    如何在Ubuntu 20.04上安装PHP Composer
  • 原文地址:https://www.cnblogs.com/h694879357/p/11762382.html
Copyright © 2011-2022 走看看