传统弱校HFUT的蒟蒻,真相只有一个

简单算术表达式计算器

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

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

#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\n",s2.top_num(s2));
    }
    return 0;
 }
手撸两个栈弄一下午也是够了

 

posted @ 2015-11-19 21:47  未名亚柳  阅读(281)  评论(0编辑  收藏  举报