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

    走过路过点个赞再走~。

  • 相关阅读:
    c++ primer 读书笔记
    如何利用c++编写不能被继承、但可以在类外定义对象的类
    为什么对多线程编程这么怕?pthread,sem,mutex,process
    死锁的理解
    动态规划--找零钱 coin change
    C++ STL中Map的按Key排序和按Value排序
    c++ STL sort struct comp
    《剑指offer》第二十五题(合并两个排序的链表)
    《剑指offer》第二十四题(反转链表)
    《剑指offer》第二十三题(链表中环的入口结点)
  • 原文地址:https://www.cnblogs.com/Kuller-Yan/p/12914124.html
Copyright © 2011-2022 走看看