zoukankan      html  css  js  c++  java
  • 逆波兰式,有关栈的问题

    /*有关逆波兰式的问题,也叫后缀表达式(将运算符写在操作数之后);例如:a+b的逆波兰式为a b +;下列程序是有关数字与数字相加的,将程序简单理解为,如果是数字,那么压入栈中,如果是运算符,那么出栈,将此前压入栈中的两个数取出栈并且相加,相加后再压入栈中,以此类推(按运算符的优先级!)*/

    #include <stdio.h>

    #include <math.h>
    #include <stdlib.h>
    #include <ctype.h>
    #define STACK_INIT_SIZE 20
    #define STACK_INCREMENT 10
    #define MAXBUFFER 10
    typedef double ElemType;
    typedef double Status;

    typedef struct
    {
    ElemType *base;
    ElemType *top;
    int stacksize;
    }SqStack;

    Status InitStack( SqStack *S )
    {
    S->base = ( ElemType *) malloc ( STACK_INIT_SIZE*sizeof( ElemType ) );
    S->top = S->base ;
    S->stacksize = STACK_INIT_SIZE;

    return 0;
    }

    //插入元素e,即入栈
    Status Push( SqStack *S , ElemType e )
    {
    if ( S->top - S->base >= S->stacksize ) //当前容量大于或等于最大容量
    {
    //追加栈的空间
    S->base = ( ElemType *) realloc ( S->base, S->stacksize + STACK_INCREMENT*sizeof( ElemType ) );
    if ( !S->base )
    return -1;
    S->top = S->base + S->stacksize ;
    S->stacksize = S->stacksize + STACK_INCREMENT;

    }
    //开始赋值
    *S->top = e;
    S->top++;

    return 0; //注意返回值为0,不是e
    }

    //弹出元素e,即出栈
    Status Pop ( SqStack *S , ElemType *e )
    {
    //首先判断栈内是否为空
    if ( S->top == S->base )
    return -1 ;

    --S->top ;
    *e = *S->top ;

    return *e; //注意返回值为e,不是0
    }

    int StackLen ( SqStack *S )
    {
    return ( S->top - S->base );
    }

    int main()
    {
    SqStack s;
    double d,e;
    char c;
    char str[MAXBUFFER];
    InitStack(&s);
    int i=0;
    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;
    }
    }
    }
    while(c!='#')
    {
    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("出错,除数不能为0");
    return -1;}
    break;
    }
    scanf("%c",c);
    }

    Pop(&s,&d);
    printf("最终结果:%f ",d);
    return 0;
    }

     //由于时间匆忙,来不及设置格式,可能是复制的原因,见谅!

  • 相关阅读:
    js调用.net后台事件,和后台调用前台等方法以及js调用服务器控件的方法
    .net反编译工具reflector5.0 的介绍及使用
    box flex 弹性盒模型
    TransactionScope使用说明
    您的主机中的软件中止了一个已建立的连接。
    Android中Handler
    转载 JavaScript的24条实用建议
    repeater中的checkbox 的方法以及datalist中放了一个按牛!为什么我按该按牛时候不能触发ItemCommand事件的主要原因
    asp.net cookies用法
    常用的数据分页技术总结
  • 原文地址:https://www.cnblogs.com/caiyineng/p/4895935.html
Copyright © 2011-2022 走看看