C语言实现逆波兰表达式

来源:互联网 发布:全国计算机二级考试vb 编辑:程序博客网 时间:2024/05/19 12:15
#include <stdio.h>#include <stdlib.h>#include <ctype.h>#define STACK_INIT_SIZE 20#define STACKINCREMENT 10#define MAXBUFFER 10typedef 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,(STACKINCREMENT+s->stackSize)*sizeof(ElemType));        if(!s->base)            exit(0);        s->top=s->base+s->stackSize;        s->stackSize=s->stackSize+STACKINCREMENT;    }    *(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);}/***逆波兰表达式**正常表达式--->逆波兰表达式**a+b--->a b +**a+(b-c)--->a b c - +**a+(b-c)*d--->a b c - d * +**a+d*(b-c)--->a d b c - * +*/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("error");                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("error!");                return -1;            }            break;        }        scanf("%c",&c);    }    Pop(&s,&d);    printf("the final result:%f",d);    return 0;}

0 0