码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-04-05 22:24:19      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:name   加法   问题   list   lis   ace   c++   入栈   top   

          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;
    }
}

 

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

标签:name   加法   问题   list   lis   ace   c++   入栈   top   

原文地址:http://www.cnblogs.com/yjd_hycf_space/p/6670330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!