学习笔记:逆波兰计算器_杨利婷

逆波兰表达式:一种不需要括号的后缀表达式,通常把它称为逆波兰表达式(RPN)

, (1-2) * (4+5) = -9

数字 1 和 2 进栈,遇到减号运算符则弹出两个元素进行运算并把结果入栈

4 和 5 入栈,遇到加号运算符,4 和 5 弹出栈,相加后将结果 9 入栈

然后又遇到乘法运算符,将 9 和 -1 弹出栈进行乘法计算,此时栈空并无数据压栈,-9 为最终运算结果

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define STACK_INIT_SIZE 30
#define STACKINCREMENT 10
#define MAXBUFFER 20
typedef double ElemType;
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stackSize;
} sqStack;
void InitStack(sqStack *s)
{
    s->top = s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if ( !s->base )
    {
        exit(0);
    }
    s->base = s->top;
    s->stackSize = STACK_INIT_SIZE;
}
void Push(sqStack *s, ElemType e)
{
    if ( s->top - s->base >= s->stackSize )
    {
        s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
        if ( !s->base )
        {
            exit(0);
        }
    }
    *(s->top) = e;
    s->top++;
}
void Pop(sqStack *s, ElemType *e)
{
    if( s->base == s->top )
    {
        return;
    }
    *e = *--(s->top);
}
int StackLen(sqStack s)
{
    return (s.top - s.base);
}
 int main()
 {
    sqStack s;
    char c;
    double d, e;
    int i = 0;
    char str[MAXBUFFER];
    InitStack( &s );
    printf("请按逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#作为结束标志: \n");
    scanf("%c", &c);
    while ( c != '#' )
    {
        while ( isdigit(c) || c == '.' ) //用于过滤数字
        {
            str[i++] = c;
            str[i] = '\0';
            if ( i >= 10 )
            {
                printf("出错:输入的单个数据过大!\n");
                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, &d);
                Push(&s, d-e);
                break;
            case '*':
                Pop(&s, &e);
                Pop(&s, &d);
                Push(&s, d*e);
                break;
            case '/':
                Pop(&s, &e);
                Pop(&s, &d);
                if ( e != 0)
                {
                    Push(&s, d/e);
                }
                else
                {
                    printf("出错:除数为零!\n");
                    return -1;
                }
                break;
        }
        scanf("%c", &c);
    }
    Pop(&s, &d);
    printf("\n最终的计算结果为: %f\n", d);
    return 0;
 }


文章录入:杨利婷 责任编辑:杨利婷
分享本文: