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;
    }
  • 相关阅读:
    MongDB简单介绍
    Docker的简单介绍
    maven简单介绍
    粗谈Springboot框架,众所周知Springboot是有spring推出的微服务框架,什么是微服务框架呢!
    Springboot打包问题,打包的话是通过
    SpringBoot注解及swagger注解使用及规范
    properties配置
    日志配置
    c++几个面试题
    c++四种强制类型转化的区别
  • 原文地址:https://www.cnblogs.com/ncuhwxiong/p/7072054.html
Copyright © 2011-2022 走看看