数据结构实验之栈三:后缀式求值

来源:互联网 发布:java免费培训 编辑:程序博客网 时间:2024/06/05 07:02

数据结构实验之栈三:后缀式求值

Time Limit: 1000MS Memory limit: 65536K

题目描述

对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。

输入

输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。

输出

求该后缀式所对应的算术表达式的值,并输出之。

示例输入

59*684/-3*+#

示例输出

57

提示

在字符串中,如果是数字,则进栈,如果是运算符则将栈中的前两个元素进行计算,然后删除栈中的前两个元素,并将新的计算结果入栈,全部完成后,出栈!
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define maxstack 1000//栈的初始存储空间#define maxadd 100//栈的每次分配的增量typedef int Elemtype;typedef struct{    Elemtype *top;//栈顶    Elemtype *base;//栈底    int stacksize;//栈大小}qstack;//初始化栈int Initstack(qstack &s){    s.base=(Elemtype *)malloc(maxstack*sizeof(Elemtype));    if(!s.base)    {        exit(0);    }    s.top=s.base;    s.stacksize=maxstack;    return 0;}//进栈int Pushstack(qstack &s,char e){    if(s.top-s.base>=s.stacksize)//栈满,追加开辟存储空间    {        s.base=(Elemtype *)realloc(s.base,(maxstack+maxadd)*sizeof(Elemtype));        if(!s.base)        {            exit(0);        }        s.top=s.base+maxstack;    }    if(e>='0'&&e<='9')    {        *s.top++=(e-'0');//将字符型转化成整型    }    else if(e=='+'||e=='-'||e=='*'||e=='/')//对栈的前两个数字进行运算    {        if(e=='+')        {            int t,t1,t2;            t=0;            t1=*(s.top-1);            *(s.top--);            t2=*(s.top-1);//注意:这个地方是减1而不是减2!            *(s.top--);            t=t1+t2;            *(s.top++)=t;        }       else if(e=='-')        {            int t,t1,t2;            t=0;            t1=*(s.top-1);            *(s.top--);            t2=*(s.top-1);            *(s.top--);            if(t1>=t2)            {                t=t1-t2;            }            else            {                t=t2-t1;            }            *(s.top++)=t;        }        else if(e=='*')        {            int t,t1,t2;            t=0;            t1=*(s.top-1);            *(s.top--);            t2=*(s.top-1);            *(s.top--);            t=t1*t2;            *(s.top++)=t;        }         else if(e=='/')        {            int t,t1,t2;            t=0;            t1=*(s.top-1);            *(s.top--);            t2=*(s.top-1);            *(s.top--);            if(t1>=t2)            {                t=t1/t2;            }            else            {              t=t2/t1;            }            *(s.top++)=t;        }    }    return 0;}//出栈void Putstack(qstack &s){    while(s.top>s.base)    {        printf("%d",*(--s.top));    }}int main(){    char a[1000];    qstack s;    Initstack(s);//初始化栈    for(int i=0; ;i++)    {        scanf("%c",&a[i]);        if(a[i]=='#')            break;        Pushstack(s,a[i]);//进栈    }    Putstack(s);//出栈    return 0;}


0 0
原创粉丝点击