zoukankan      html  css  js  c++  java
  • 栈的操作实现逆波兰表达式的计算

    代码如下:

    #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){
            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->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=='.' ) {
                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,&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("
    出错,除数为零
    ");
                    return -1;
                }
                break;
            }
            scanf("%c",&c);
        }
        pop(&s,&d);
        printf("最后的结果为:%f
    ",d);
        return 0;
    }
  • 相关阅读:
    自适应图形的绘制
    红色椭圆、蓝色正方形、黄色三角形、紫色五角星
    [2020牛客寒假算法基础集训营2]G-判正误
    [2020牛客寒假算法基础集训营1]I-nico和niconiconi
    [2020牛客寒假算法基础集训营1]H-nozomi和字符串
    [2020牛客寒假算法基础集训营1]A-honoka和格点三角形
    约瑟夫环以及其变种集合
    unsign long long 与 long long
    【POJ-3279】Fliptile
    B--Bookshelf 2
  • 原文地址:https://www.cnblogs.com/ncuhwxiong/p/7072054.html
Copyright © 2011-2022 走看看