首页 > 其他 > 详细

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

时间:2014-06-28 16:27:01      阅读:432      评论:0      收藏:0      [点我收藏+]

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

         

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

 

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");
    }
}

 

一般算数表达式转换为“后缀式”,布布扣,bubuko.com

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

原文:http://www.cnblogs.com/yspworld/p/3797803.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!