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

来源:互联网 发布:移动协同软件最新版 编辑:程序博客网 时间:2024/06/03 01:42
          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;    }}