逆波兰计算器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;
}

走过路过点个赞再走~。

原文地址:https://www.cnblogs.com/Kuller-Yan/p/12914124.html