| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 297 人关注过本帖
标题:关于数据结构表达式求值的问题
只看楼主 加入收藏
shang713111
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-10-19
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
关于数据结构表达式求值的问题
我写了一个程序但是总出现问题,上网查了下都是代码也没什么说明,所以想看下别人的思路,所以看下大家解这个问题的思路是怎么样,谢谢了
我的思路是,设置2个栈,一个读入操作数,一个读入运算符,是根据顺序来的(因为第一个肯定是操作数,操作数后面肯定是跟的运算符)。然后当操作数的栈中满了3个数,则判断相应运算符栈中的优先级,比较然后进行运算,比如 1+2*3    *号优先级大于+。将操作数的栈中2换成6,剔除3,然后运算符栈中将*号剔除,如果是1*2+3,则将操作数栈中1换成2,将2换成3,提出3,运算符中也是,但是老是出问题。。。。。下面是代码
#include<stdio.h>
#include<stdlib.h>
#define SIZE 10
struct now{
    char *base;
    char *top;
    int stacksize;
}Q;
struct go{
    int *base;
    int *top;
    int stacksize;
}S;
void build_stack(void);
void check(void);
char compare(char a,char b);
int main()
{
    check();
    return 0;
   
}
void build_stack(void)                   //创建空栈
{
    S.base=(int*)malloc(sizeof(int)*SIZE);
    if(!S.base)
    {
        printf("分配空间失败!\n");
        exit(1);
    }
    S.top=S.base;
    Q.base=(char*)malloc(sizeof(char)*SIZE);
    if(!Q.base)
    {
        printf("分配空间失败!\n");
        exit(1);
    }
    Q.top=Q.base;
}
char compare(char a,char b)                    //判断优先级
{
    char c;
    if((a=='-' || a=='+') && (b=='*' || b=='/'))
        c='<';
    else if((a=='-' || a=='+') && (b=='-' || b=='+'))
        c='>';
    else if((a=='*' || b=='/') && (b=='-' || a=='+'))
        c='>';
    else if((a=='*' || a=='/') && (b=='*' || b=='/'))
        c='>';
    return c;
}      
void check(void)
{
    char c;
    int num,m;
    int n=0;
    build_stack();
    while(c!='\n')
    {   
        if(!(n%2))
        {   
            scanf("%d",&m);
            *++S.top=m;
            n++;
        }
        else if((c=getchar())!='\n')
        {
            *++Q.top=c;
            n++;
        }
        if((S.top-S.base)==3)
            {
                switch(compare(*(Q.top-1),*Q.top))
                {
                    case '>':
                    {
                        if(*(Q.top-1)=='*')
                            *(S.top-2)=(*(S.top-2))*(*(S.top-1));
                        else if(*(Q.top-1)=='/')
                            *(S.top-2)=(*(S.top-2))/(*(S.top-1));
                        else if(*(Q.top-1)=='-')
                            *(S.top-2)=(*(S.top-2))-(*(S.top-1));
                        else if(*(Q.top-1)=='+')
                            *(S.top-2)=(*(S.top-2))+(*(S.top-1));
                        *--S.top=*S.top;
                        *(--Q.top)=*Q.top;
                    }
                    case '<':
                    {
                        if(*Q.top=='*')
                            *(--S.top)=(*(S.top-1)) * (*(S.top));
                        else
                            *(--S.top)=(*(S.top-1)) / (*(S.top));
                    }
                }
            }
        if(c=='\n')
            break;
    }
    if(*Q.top=='+')
        num=*(S.top-1) + (*S.top);
    else if(*Q.top=='-')
        num=*(S.top-1) - (*S.top);
    else if(*Q.top=='*')
        num=*(S.top-1) * (*S.top);
    else if(*Q.top=='/')
        num=*(S.top-1) / (*S.top);
    printf("%d\n",num);
}
   

   
   

搜索更多相关主题的帖子: 表达式 优先级 
2012-10-19 13:27
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:10 
《数据结构基础》C语言版,里面讲栈的时候,有表达式求值算法,可以参考一下

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-10-26 07:14
遗矢的老人
Rank: 9Rank: 9Rank: 9
来 自:成都
等 级:蜘蛛侠
威 望:7
帖 子:325
专家分:1131
注 册:2012-7-20
收藏
得分:10 
你在这论坛里找下,记得之前一贴也写了这个,而且写得还不错,搜下嘛
2012-10-26 23:40
快速回复:关于数据结构表达式求值的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011648 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved