zoukankan      html  css  js  c++  java
  • 简单算术表达式计算器

    最恨那些一点不珍惜别人劳动成果,问一两句就否定之类的老师,我也只能是呵呵呵呵呵。

    说是什么没有按他说的那个什么破表写,然后看也不看就走了,呵呵呵呵

    #include<iostream>
    #include<math.h>
    #include<stdio.h>
    #include<malloc.h>
    #include<string.h>
    #include<stdlib.h>
    #define max 100
    using namespace std;//push(i) pop() top() empty()
    class a_stack
    {
       private:
        double donser[max];
        int length=0;
       public:
        void push_num(a_stack &l,double i);//入栈push
        void pop_num(a_stack &l);//出栈pop
        double top_num(a_stack &l);//返回栈顶数据top
        int check_empty(a_stack &l);//检查是否为空empty
    };
    class b_stack
    {
       private:
        char donser1[max];
        int length1=0;
       public:
        void push_num(b_stack &l,char i);//入栈push
        void pop_num(b_stack &l);//出栈pop
        int top_num(b_stack &l);//返回栈顶数据top
        int check_empty(b_stack &l);//检查是否为空empty
    };
    
    void a_stack::push_num(a_stack &l,double i)
    {
        int k;
        l.length++;
        k=l.length;
        l.donser[k]=i;
    }
    
    void a_stack::pop_num(a_stack &l)
    {
        int k;
        k=l.length;
        l.length--;
        l.donser[k]=0;
    }
    
    double a_stack::top_num(a_stack &l)
    {
        return l.donser[l.length];
    }
    
    int a_stack::check_empty(a_stack &l)//1为空
    {
        if(l.length==0){return 1;}
        else return 0;
    }
    
    
    
    void b_stack::push_num(b_stack &l,char i)
    {
        int k;
        l.length1++;
        k=l.length1;
        l.donser1[k]=i;
    }
    
    void b_stack::pop_num(b_stack &l)
    {
        int k;
        k=l.length1;
        l.length1--;
        l.donser1[k]=0;
    }
    
    int b_stack::top_num(b_stack &l)
    {
        return l.donser1[l.length1];
    }
    
    int b_stack::check_empty(b_stack &l)//1为空
    {
        if(l.length1==0){return 1;}
        else return 0;
    }
    
    int i;
    double a,b;
    char s[250],c;
    int main()
    {
        cout<<"输入算式:";
        while(gets(s),strcmp(s,"#")!=0)
        {
            //stack<char>s1;
            //stack<double>s2;
            b_stack s1;
            a_stack s2;
    
            for(i=0;s[i];i++)
            {
                if(s[i]>='0'&&s[i]<='9') //如果是数字继续找数字
                {
                    a=0;
                    while(s[i]>='0'&&s[i]<='9')
                    {
                        a=a*10+s[i]-'0';
                        i++;
                    }
                    i--;
                    s2.push_num(s2,a);
                }
                else if(s[i]=='(') //如果(
                {
                    s1.push_num(s1,s[i]);
                }
                else if(s[i]==')') //如果)
                {
                    while(s1.top_num(s1)!='(')//找不到前括号就循环
                    {
                        c=s1.top_num(s1);//符号top
                        s1.pop_num(s1);//删掉
                        a=s2.top_num(s2);//数字top
                        s2.pop_num(s2);//删掉
                        b=s2.top_num(s2);//当前数字top
                        s2.pop_num(s2);//删掉
                        if(c=='+') a+=b;
                        if(c=='-') a=b-a;
                        if(c=='*') a=b*a;
                        if(c=='/') a=b/a;
                        s2.push_num(s2,a);
                    }
                    s1.pop_num(s1);//删除前括号
                    if(s1.check_empty(s1)==1){continue;}
                    if(s1.top_num(s1)=='*') //去掉括号以后栈还是乘
                    {
                        s1.pop_num(s1);//删掉
                        a=s2.top_num(s2);//数字top
                        s2.pop_num(s2);//删掉
                        b=s2.top_num(s2);//当前数字top
                        s2.pop_num(s2);//删掉
                        a=b*a;
                        s2.push_num(s2,a);
                    }
                }
                else if(s[i]=='-'||s[i]=='+') //如果是+-
                {
                    if(s1.check_empty(s1)==0&&s1.top_num(s1)!='(')//优先级低或者一样交换符号
                    {
                        c=s1.top_num(s1);//字符栈顶
                        s1.pop_num(s1);//删掉
                        a=s2.top_num(s2);//数字栈顶1
                        s2.pop_num(s2);//删掉
                        b=s2.top_num(s2);//数字栈顶2
                        s2.pop_num(s2);//删掉
                        if(c=='+') a+=b;
                        if(c=='-') a=b-a;
                        if(c=='*') a=b*a;
                        if(c=='/') a=b/a;
                        s2.push_num(s2,a);//运算以后的入数字栈
                        s1.push_num(s1,s[i]);//字符入栈
                    }
                    else if(s1.check_empty(s1)==1||s1.top_num(s1)=='(')//如果空或者前括号
                    {
                        s1.push_num(s1,s[i]);//字符入栈
                    }
                }
                else if(s[i]=='/') //如果除
                {
                    b=0;
                    c=s[i];//存一下符号
                    if(s1.check_empty(s1)==1||s1.top_num(s1)=='(') //空就入栈不运算
                    {
                        s1.push_num(s1,c);
                        continue;
                    }
                    i+=2;//找符号后面的数字
                    while(s[i]>='0'&&s[i]<='9')
                    {
                        b=b*10+s[i]-'0';
                        i++;
                    }
                    i--;//找到数字
                    a=s2.top_num(s2);//取出数字栈顶
                    s2.pop_num(s2);//删掉
                    if(s1.top_num(s1)=='*') //优先级一样交换符号
                    {
                        a=a*b;
                        s1.pop_num(s1);//删除原来的
                        s1.push_num(s1,c);//换成新的
                    }
                    else a=a/b;//优先级高做除法
                    s2.push_num(s2,a);//新数字入栈
                }
                else if(s[i]=='*') //如果乘
                {
                    b=0;
                    c=s[i];
                    if(s1.check_empty(s1)==1||s1.top_num(s1)=='(')
                    {
                        s1.push_num(s1,c);
                        continue;
                    }
                    i+=2;
                    if(s[i]=='(')
                    {
                        s1.push_num(s1,c);
                        i--;
                        continue;
                    }
                    while(s[i]>='0'&&s[i]<='9')
                    {
                        b=b*10+s[i]-'0';
                        i++;
                    }
                    i--;
                    a=s2.top_num(s2);
                    s2.pop_num(s2);
                    if(s1.top_num(s1)=='/')
                    {
                        a=a/b;
                        s1.pop_num(s1);
                        s1.push_num(s1,c);
                    }
                    else if(s1.top_num(s1)!='/')
                    {
                        a=a*b;
                    }
                    s2.push_num(s2,a);
                }
    
            }
            while(!s1.check_empty(s1))//如果符号栈非空就循环
            {
                c=s1.top_num(s1);//符号top
                s1.pop_num(s1);//删掉
                a=s2.top_num(s2);//数字top
                s2.pop_num(s2);//删掉
                b=s2.top_num(s2);//当前数字top
                s2.pop_num(s2);//删掉
                if(c=='+') a+=b;
                if(c=='-') a=b-a;
                if(c=='*') a=b*a;
                if(c=='/') a=b/a;
                s2.push_num(s2,a);
            }
            printf("%.2f
    ",s2.top_num(s2));
        }
        return 0;
     }
    手撸两个栈弄一下午也是够了
  • 相关阅读:
    HTML DOM clearInterval() 方法
    clone() 方法
    Java EE 6体系结构的变革
    我们看人的眼光
    NetBeans 时事通讯(刊号 # 44 Feb 10, 2009)
    jBPM 与项目的适用性探讨
    Java EE 6体系结构的变革
    jBPM 与项目的适用性探讨
    系分又挂了 :)
    NetBeans 时事通讯(刊号 # 44 Feb 10, 2009)
  • 原文地址:https://www.cnblogs.com/dzzy/p/4979163.html
Copyright © 2011-2022 走看看