• C++实现 逆波兰表达式计算问题


              C++实现 逆波兰表达式计算问题

    #include <iostream>
    #include <string>
    using namespace std;
    class Stack
    {
    private:
        int size;
        int top;
        float *listArray;
    public:
        Stack(int sz=20);
        ~Stack();
        bool push(float it);//入栈
        bool pop(float& it);//出栈
        bool isEmpty();//判断栈是否为空
        bool isOne();//判断栈里是否一个元素
    };
    Stack::Stack(int sz)  //栈构造函数
    {
        size=sz;
        top=0;
        listArray=new float[size];
    }
    bool Stack::push(float it)
    {
        if(top==size)
            return false;
        listArray[top++]=it;
        return true;
    }
    bool Stack::pop(float& it)
    {
        if(top==0)
            return false;
        it=listArray[--top];
        return true;
    }
    bool Stack::isEmpty() //判断站是否为空
    {
        if(top==0)
            return true;
        return false;
    }
    bool Stack::isOne()
    {
        if(top==1)
            return true;
        return false;
    }
    Stack::~Stack()
    {
        delete listArray;
    }
    //此函数传进输入的字符串,并对字符串进//行扫描并进行相应处理,得到结果(函数声//明)
    void compute(char* str);  
    int main()
    {
        char str[20];
        cin.getline(str,20,'#');
        compute(str);
        return 0;
    }
    //此函数传进输入的字符串,并对字符串进//行扫描并进行相应处理,得到结果(函数体)
    void compute(char*  str)
    {
        Stack aStack;
        float x=0,y=0,s1,s2,temp;
        int i;
        i=0;
        while(str[i])
        {
            switch(str[i])
            {
                case '+': //加法运算
                if(aStack.isOne()||aStack.isEmpty()) 
                {
                    cout << "表达式不符合要求";
                        return;
                    }
                    aStack.pop(s1);
                    aStack.pop(s2);
                    x=s2+s1;
                    aStack.push(x);
                    x=0;i++;break;
                case '-': //减法运算
                if(aStack.isOne()||aStack.isEmpty())        
                {    cout << "表达式不符合要求";
                            return;
                }
                aStack.pop(s1); aStack.pop(s2);
                x=s2-s1; 
                aStack.push(x);
                x=0;
                 i++;
                break;
                case '*': //乘法运算
                if(aStack.isOne()||aStack.isEmpty())        
                {
                    cout << "表达式不符合要求";
                    return;
                }
                aStack.pop(s1); aStack.pop(s2);
                x=s2*s1;
                aStack.push(x);
                x=0;
                i++;
                break;
                case '/': //除法运算
                if(aStack.isOne()||aStack.isEmpty())
                {
                    cout << "表达式不符合要求";
                    return;
                }
                aStack.pop(s1);
                aStack.pop(s2);
                if(s1==0)
                {
                cout << "分母为0!" << endl;
                return;
                }
                x=s2/s1;
                aStack.push(x);
                x=0;
                i++;
                break;
                case ' ': //如果是空格,将数据x押入栈中
                if(str[i-1]>=48&&str[i-1]<=57) 
                        aStack.push(x);
                    x=0;
                    i++;
                    y=0;
                    break;
                case '.': //获得小数部分
                temp=10.0;
                while(str[++i]!=' ')                     {
                        if(str[i]>=48&&str[i]<=57)                y=y+(str[i]-48)/temp;
                        temp*=10;
                    }
                    x+=y;
                    break;
                default: //将字符数字转换为浮点型的数字
                if(str[i]>=48&&str[i]<=57)                {
                x=x*10+str[i]-48;
                        i++;
                    }
                }
            }
    //判断栈是否只有切仅有一个元素,是就输//出结果
    if(aStack.isOne())    {
            aStack.pop(x);
            cout << str << '=' << x << endl;
        }
    }
  • 相关阅读:
    如何制作对联式广告所需的flash图像文件
    GHOST重装系统详解
    Multipledimensional Vector,C++
    Dvbbs展区图片调用(向上滚动样式)
    fatal error C1001: INTERNAL COMPILER ERROR
    硬盘坏道的探测与恢复
    FreeBSD 使用手册
    全美电影票房排行(截止2010.12.19)
    Linux环境下的C/C+基础调试技术2——程序控制
    在freebsd下安装vim(Debian下类似)
  • 原文地址:https://www.cnblogs.com/yjd_hycf_space/p/6670330.html
Copyright © 2020-2023  润新知