首页 > 代码库 > 栈的操作实现逆波兰表达式的计算

栈的操作实现逆波兰表达式的计算

代码如下:

#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("请按逆波兰表达式输入待计算数据,数据与计算符之间用空格隔开,以#作为结束标志:\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出错,除数为零\n");
                return -1;
            }
            break;
        }
        scanf("%c",&c);
    }
    pop(&s,&d);
    printf("最后的结果为:%f\n",d);
    return 0;
}

 

栈的操作实现逆波兰表达式的计算