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

Posted byerHu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的操作实现逆波兰表达式的计算相关的知识,希望对你有一定的参考价值。

代码如下:

#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;
}

 

以上是关于栈的操作实现逆波兰表达式的计算的主要内容,如果未能解决你的问题,请参考以下文章

栈的典型实例问题——后缀表达式(逆波兰记号)的计算

算法与数据结构--栈的应用-逆波兰计算器完整版代码

栈的应用-逆波兰式

Java代码实现逆波兰计算器

(C语言中)逆波兰算法(及计算器)

波兰表达式与逆波兰表达式介绍及中缀表达式转逆波兰表达式代码实现