zoukankan      html  css  js  c++  java
  • 逆波兰计算器1.0 (c语言 栈实现)支持小数计算

    逆波兰计算器(C语言栈实现)

    逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为2 3 +。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为*2 3 + 4 *。其中运算符包括+ - * /四个。

    并且由于栈具有后进先出的特性,所以用来实现逆波兰计算器就会十分方便.

    话不多说,让我们上代码~:

    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    
    # define STACK_INIT_SIZE 20
    # define STACKINCREMENT 10
    # define MAXBUFFER 10
    
    typedef double ElemType;
    typedef struct
    {
        ElemType *base;
        ElemType *top;
        int stackSize;
    }sqstack;
    
    
    void Initstack(sqstack *s)
    {
        s->base =(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
        if(!s->base)
        {
            exit(0);
        }
        s->top=s->base;
        s->stackSize=STACK_INIT_SIZE;
    }
    
    void push(sqstack *s,ElemType e)
    {
        if(s->top-s->base>=s->stackSize)    //栈满,增加栈的size
        {
            s->base=(ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
            if(!s->base)
            {
                exit(0);   	//表示空间分配失败,用exit函数跳出。
            }
        }
        *(s->top)=e;
        s->top++;
    }
    
    void Pop(sqstack *s,ElemType *e)
    {
        if(s->top==s->base)
        {
            return;
        }
        *e=*--(s->top);
    }
    
    int StackLen(sqstack s)
    {
        return (s.top-s.base);
    }
    
    int main()
    {
        sqstack s;
        char c;
        double d, e;
        char str[MAXBUFFER];
        int i=0;
        Initstack(&s);
        printf("请按逆波兰表达式输入待计算数据,数据与运算符之间以空格隔开,以#符号作为结束标志:
    ");
        scanf("%c",&c);
        while(c!='#')
        {
            while(isdigit(c)||c=='.')       //isdigit判断‘c'的ASCLL码是不是在48-57之间,需要ctype.h头文件。
            {
                str[i++]=c;             //用于过滤数字。
                str[i]='';
                if(i>=10)
                {
                    printf("出错,输入的单个数据过大,超过我们设置的键盘缓冲区");
                    return -1;
                }
                scanf("%c",&c);
                if(c==' ')
                {
                    d=atof(str);	//将字符型转化为浮点型
                    push(&s,d);
                    i=0;
                    break;
                }
            }
            switch(c)
            {
            case '+':
                Pop(&s,&e);
                Pop(&s,&d);
                push(&s,d+e);
                break;
            case '-':
                Pop(&s,&e);
                Pop(&s,&e);
                push(&s,d-e);
                break;
            case '*':
                Pop(&s,&e);
                Pop(&s,&d);
                push(&s,d*e);
            case '/':
                Pop(&s,&e);
                if(e==0)
                {
                    printf("
    除数等于0,输入错误。
    ");
                    return -1;
                }
                else
                {
                    Pop(&s,&d);
                    push(&s,d/e);
                    break;
                }
            }
            scanf("%c",&c);
        }
        Pop(&s,&d);
        printf("
    最终的计算结果为:%f
    ",d);
        return 0;
    }

    走过路过点个赞再走~。

  • 相关阅读:
    通过HttpListener实现简单的Http服务
    WCF心跳判断服务端及客户端是否掉线并实现重连接
    NHibernate初学六之关联多对多关系
    NHibernate初学五之关联一对多关系
    EXTJS 4.2 资料 跨域的问题
    EXTJS 4.2 资料 控件之Grid 那些事
    EXTJS 3.0 资料 控件之 GridPanel属性与方法大全
    EXTJS 3.0 资料 控件之 Toolbar 两行的用法
    EXTJS 3.0 资料 控件之 combo 用法
    EXTJS 4.2 资料 控件之 Store 用法
  • 原文地址:https://www.cnblogs.com/Kuller-Yan/p/12914124.html
Copyright © 2011-2022 走看看