| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 274 人关注过本帖
标题:计算表达式的程序,请大神们看看咋错的。。。。
只看楼主 加入收藏
muyangcaiwei
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-10-29
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:2 
计算表达式的程序,请大神们看看咋错的。。。。
#include <stdio.h>
#include <STDLIB.H>
typedef struct nod//定义运算符节点
    {
        char data;
        struct nod *next;
    }stackl;
typedef struct  
{
     stackl *base;
     stackl *top;
}sqstack;


typedef struct node//定义一个存放数字的节点
{
    int data;
    struct node *next;
}stacks;
typedef struct  
{
    stacks *base;
    stacks *top;
}ysstack;


/*构造存放运算符和操作数的空栈*/

char initstack(sqstack *s)//构造一个存放运算符的空栈
{
    s->base=(stackl *)malloc(50*sizeof(stackl));
    if(!s->base) return 0;
    s->top=s->base;
    return 1;
}
int initstacks(ysstack *s)//构造一个存放操作数的空栈
{
    s->base=(stacks *)malloc(50*sizeof(stackl));
    if(!s->base) return 0;
    s->top=s->base;
    return 1;
};


/*构造进栈函数*/
char push(sqstack *s,char e)//运算符进栈
{

    s->top->data=e;
    s->top++;
    return 1;
}
int pushs(ysstack *s,int e)//操作数进栈
{
   
    s->top->data=e;
    s->top++;
    return 1;
}

/*构造出栈函数*/
char pop(sqstack *s)//运算符出栈
{
    //s->top-1;
    char e;
    e=(s->top-1)->data;
    s->top--;
    return e;
}
int pops(sqstack *s)//操作数出栈
{
    //s->top-1;
    int e;
    e=(s->top-1)->data;
    s->top--;
    return e;
}


/*构造获取栈顶元素的函数*/
char gettop(sqstack *s)//获取运算符栈顶元素

{
    char e;
    e=(s->top-1)->data;
    return e;
}
int gettops(sqstack *s)//获取操作数栈顶元素

{
    int e;
    e=(s->top-1)->data;
    return e;
}


char ysf(char b,char c)//检测操作符的优先级
{
    switch(c)
    {
        case '+':
            switch(b)
            {
                case '+':return '>';break;
                case '-':return '>';break;
                case '*':return '>';break;
                case '/':return '>';break;
                case '(':return '<';break;
                case ')':return '>';break;
                case '#':return '<';break;
                           
            }
        case '-':
            switch(b)
            {
                case '+':return '>';break;
                case '-':return '>';break;
                case '*':return '>';break;
                case '/':return '>';break;
                case '(':return '<';break;
                case ')':return '>';break;
                case '#':return '<';break;
               
            }
        case '*':
            switch(b)
            {
                case '+':return '<';break;
                case '-':return '<';break;
                case '*':return '>';break;
                case '/':return '>';break;
                case '(':return '<';break;
                case ')':return '>';break;
                case '#':return '<';break;
               
            }
        case '/':
            switch(b)
            {
                case '+':return '<';break;
                case '-':return '<';break;
                case '*':return '>';break;
                case '/':return '>';break;
                case '(':return '<';break;
                case ')':return '>';break;
                case '#':return '<';break;
               
            }
            case '(':
                switch(b)
                {
                    case '+':return '<';break;
                    case '-':return '<';break;
                    case '*':return '<';break;
                    case '/':return '<';break;
                    case '(':return '<';break;
                    case ')':return 0;break;
                    case '#':return '<';break;
                        
                }
            case ')':
                switch(b)
                {
                    case '+':return '>';break;
                    case '-':return '>';break;
                    case '*':return '>';break;
                    case '/':return '>';break;
                    case '(':return '=';break;
                    case ')':return '>';break;
                    case '#':return 0;break;
                        
                }
            case '#':
                switch(b)
                {
                    case '+':return '>';break;
                    case '-':return '>';break;
                    case '*':return '>';break;
                    case '/':return '>';break;
                    case '(':return 0;break;
                    case ')':return '>';break;
                    case '#':return '=';break;
                    
                }


    }
}

int operate(int a,char b,int c)//对操作数进行运算
{
    switch(b)
    {
        case '+':
            return (a+c);
            break;
        case '-':
            return (a-c);
            break;
        case '*':
            return (a*c);
            break;
        case '/':
            return (a/c);
            break;
    }
}

int evaluate()
{
    char a,b,c,d,theta;
    ysstack *shu=(stacks *)malloc(sizeof(stacks));
    sqstack *fu=(stackl *)malloc(sizeof(stackl));
    initstack(fu);
    push(fu,'#');
    initstacks(shu);
    c=getchar();
    while (c!='#'||gettop(fu)!='#')
    {
        if((c!='+')&&(c!='-')&&(c!='*')&&(c!='/')&&(c!='=')&&(c!='#')&&(c!='(')&&(c!=')'))
        {
            pushs(shu,c);
            c=getchar();
        }//如果不是操作数则进栈
        else
            switch(ysf(gettop(fu),c))
        {
            case'<':
                push(fu,c);c=getchar();
                break;
            case'=':
                pop(fu,gettop(fu));
                c=getchar();
                break;
            case '>':
                theta=pop(fu);
                a=pops(shu);
                b=pops(shu);
                d=operate(a,theta,b);
                pushs(shu,d);
                break;
        }
        
        
    }
    return gettops(shu);
}


int main()
{
    int b;
    printf("请输入运算式:\n");
    b=evaluate();
    printf("运算结果是:%d\n",b);
    return 0;
}
搜索更多相关主题的帖子: 表达式 include next 
2012-10-29 22:39
一个孩子
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:356
专家分:954
注 册:2012-10-1
收藏
得分:7 
太长了,建议每个个函数放在单独的源文件里,这样看可读性强,也比较容易改,如果比较长的程序(你的应该不是大程序。。)分块的话会比较好弄一点。

重要的不是结果,是求一个结果的过程,哪怕千难万难,当你有想要的结果时,你已走的很远
2012-10-29 22:48
muyangcaiwei
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-10-29
收藏
得分:0 
回复 2楼 一个孩子
好的,不过现在的问题是我就算单独放在源文件里也不知道哪里错了。。。。求指导。。
2012-10-29 22:51
快速回复:计算表达式的程序,请大神们看看咋错的。。。。
数据加载中...
 
   



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

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