首页 > 代码库 > 一般算数表达式转换为“后缀式”

一般算数表达式转换为“后缀式”

“师创杯”第六届ACM程序设计竞赛获奖情况

         

<style></style>

数据结构实验之栈二:一般算术表达式转换成后缀式

 

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。

输入

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

输出

输出该表达式转换所得到的后缀式。

示例输入

a*b+(c-d/e)*f#

示例输出

ab*cde/-f*+

提示

       所谓 后缀式表达式 即是:计算机内部对算式的处理先后顺序式!

      此题写了半个小时哈,数据结构课本里的代码实在是难看。故,本人只是参看了算法,自己手敲的代码,运用栈的思想,

      我的代码需要注意的地方是:当遇到 ‘ ) ‘时,该怎么搞?!!

      本人的一贯做法,对于栈只是我用来存储的数组,每次我都是用一个e的下表指针来进行数据处理,遇到该出栈的数据,

      我就把它给赋值掉,或者改变指针的位置,访问不到那个数据哈!

     

#include <stdio.h>#include <string.h>char a[1000];char s[1000];void main(){    int i, j, e, k;    int len;    while(scanf("%s", a)!=EOF)    {        len = strlen(a);        memset(s, 0, sizeof(s));        e = 0;        i = 0;        while( i < len-1 )        {            if( a[i]>=a && a[i]<=z)            {                printf("%c", a[i] );            }            else            {                if(e==0)                {                    s[e++] = a[i];                }                else if(e>0)                {                                                            if(a[i] == ()                    {                        s[e++] = a[i];                    }                    if(a[i] == +)                    {                        if( s[e-1]==( )                        {                            s[e++] = a[i];                        }                        else if(s[e-1]==* || s[e-1]==/ ||s[e-1]==+ || s[e-1]==- )                        {                            printf("%c", s[e-1] );                            s[e-1] = a[i];                        }                    }                    if(a[i] == -)                    {                        if( s[e-1]==( )                        {                            s[e++] = a[i];                        }                        else if(s[e-1]==- || s[e-1]==* || s[e-1]==/ || s[e-1]==+ )                        {                            printf("%c", s[e-1] );                            s[e-1] = a[i];                         }                    }                    if( a[i] == *)                    {                        if(s[e-1]==+ || s[e-1]==- || s[e-1]==( )                        {                            s[e++] = a[i];                        }                        else if(s[e-1]==* || s[e-1]==/ )                        {                            printf("%c", s[e-1] );                            s[e-1] = a[i];                        }                    }                    if( a[i] == /)                    {                        if(s[e-1]==+ || s[e-1]==- || s[e-1]==( )                        {                            s[e++] = a[i] ;                        }                        else if(s[e-1]==* || s[e-1]==/ )                        {                            printf("%c", s[e-1] );                            s[e-1] = a[i];                        }                    }                    if( a[i] == ))                    {                        for(j=e-1; j>=0; j-- )                        {                            if(s[j]==()                            {                                e = j;                                break;                            }                            else                            {                                printf("%c", s[j] );                            }                        }                    }                }            }                        i++;        }        for(k=e-1; k>=0; k--)        {            printf("%c", s[k] );        }        printf("\n");    }}

       一开始使用switch语句写的,结果运行错误,读者朋友可以给我指正哈!

       此乃bug版本,哈哈哈哈哈哈哈哈哈哈!!!

#include <stdio.h>#include <string.h>char a[1000];char s[1000]; void main(){    int i, j, e, k;    int len;    while(scanf("%s", a)!=EOF)    {        len = strlen(a);        memset(s, 0, sizeof(s));        e = 0;        i = 0;        while( i < len )        {            if( a[i]>=a && a[i]<=z)            {                printf("%c", a[i] );            }            else            {                if(e==0)                {                    s[e++] = a[i];                }                else if(e>0)                {                    switch( a[i] )                    {                        case (:                            {                                s[e++] = a[i];                            }                        case +:                            {                                if( s[e-1]==( )                                {                                    s[e++] = a[i];                                }                                else if(s[e-1]==* || s[e-1]==/ ||s[e-1]==+ || s[e-1]==- )                                {                                    printf("%c", s[e-1] );                                    s[e-1] = a[i];                                }                            }                        case -:                            {                                if( s[e-1]==( )                                {                                    s[e++] = a[i];                                }                                else if(s[e-1]==- || s[e-1]==* || s[e-1]==/ || s[e-1]==+ )                                {                                    printf("%c", s[e-1] );                                    s[e-1] = a[i];                                 }                            }                        case *:                            {                                if(s[e-1]==+ || s[e-1]==- || s[e-1]==( )                                {                                    s[e++] = a[i];                                }                                else if(s[e-1]==* || s[e-1]==/ )                                {                                    printf("%c", s[e-1] );                                    s[e-1] = a[i];                                }                            }                        case /:                            {                                if(s[e-1]==+ || s[e-1]==- || s[e-1]==( )                                {                                    s[e++] = a[i] ;                                }                                else if(s[e-1]==* || s[e-1]==/ )                                {                                    printf("%c", s[e-1] );                                    s[e-1] = a[i];                                }                            }                        case ):                            {                                for(j=e-1; j>=0; j-- )                                {                                    if(s[j]==()                                    {                                        e = j;                                        break;                                    }                                    else                                    {                                        printf("%c", s[j] );                                    }                                }                            }                    }                }            }            i++;        }        for(k=e-1; k>=0; k--)        {            printf("%c", s[k] );        }        printf("\n");    }}