鱼C论坛

 找回密码
 立即注册
查看: 3458|回复: 5

我的算术表达式怎么改才能进行十位数以上的求值

[复制链接]
发表于 2014-4-22 22:03:35 | 显示全部楼层 |阅读模式
10鱼币
#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT  20
#define MAXBUFFER       20

typedef struct
{
        float *base;
        float *top;
        int stackSize;
}FStack;

typedef struct
{
        char *base;
        char *top;
        int stackSize;
}CStack;

FStack OPND;//全局变量
CStack OPTR;

void InitStack_Float(FStack *s)
{
        s->base = (float *)malloc(STACK_INIT_SIZE * sizeof(float));
        if( !s->base )
                exit(0);
        s->top = s->base;
        s->stackSize = STACK_INIT_SIZE;
}

void InitStack_Char(CStack *s)
{
        s->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
        if( !s->base )
                exit(0);
            s->top = s->base;
        s->stackSize = STACK_INIT_SIZE;
}

void Push_F(FStack *s, float e)
{
        if( s->top - s->base >= s->stackSize )
        {
                s->base = (float *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(float));
                if( !s->base )
            exit(0);
                s->top = s->base + s->stackSize;
                s->stackSize = s->stackSize + STACKINCREMENT;
        }
        *(s->top) = e;
        s->top++;
}

void Push_C(CStack *s,char e)
{
        if( s->top - s->base >= s->stackSize )
        {
                s->base = (char *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(char));
                if( !s->base )
            exit(0);
                s->top = s->base + s->stackSize;
                s->stackSize = s->stackSize + STACKINCREMENT;

        }
        *(s->top) = e;
        s->top++;
}

float Pop_F(FStack *s)
{
        float e;
        if( s->top == s->base )
        return 0;
        e = *--(s->top);
        return e;
}

char Pop_C(CStack *s)
{
        char e;
        if( s->top == s->base )
                  return 0;
        e = *--(s->top);
        return e;
}

int in(char ch)
{
        return (ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}

int StackLen(FStack s)
{
    return (int)(s.top - s.base);
}

float GetTop_F(FStack s) //?°’a??‘?à?
{
        float e;
        if(s.top == s.base)
        {
                return 0;
        }
        e = *(s.top - 1);
        return e;
}

char GetTop_C(CStack s)
{
        char e;
        if(s.top == s.base)
        {
                return 0;
        }
        e = *(s.top - 1);
        return e;
}

char Precede(char theta1,char theta2)  //运算符优先权
{
        int a,b;
        switch(theta1)
        {
        case'=':
                  a=0;
                  break;
        case'(':
                  a=1;
                  break;
        case'+':
        case'-':
                  a=3;
                  break;
          case'*':
          case'/':
          case'%':
                  a=5;
                  break;
        case')':
                  a=6;
                  break;
        }

        switch(theta2)
        {
        case'=':
                  b=0;
                  break;
          case'(':
                  b=6;
                  break;
          case'+':
          case'-':
                  b=2;
                  break;
        case'*':
        case'/':
        case'%':
                  b=4;
                  break;
        case')':
                  b=1;
            break;
        }
        if(a<b)
                return '<';
        else if(a==b)
                return'=';
        else
                return '>';
}

float Operators(float a,char c,float b)
{
        switch(c)
        {
        case'+':
                  return (a+b);
          case'-':
                  return (a-b);
        case'*':
                  return (a*b);
        case'/':
                  if(0 == b)
                  {
                          printf("错误!除数不能等于0!\n");
                          exit(0);
                  }
                  else
                  {
                          return (a/b);
                  }
        }
        return 1;
}

float EvalueteExpression()
{
        char c,theta,x;
        float a,b;
        c = getchar();
        while(c!='#'||GetTop_C(OPTR)!='#')
        {
                if(!in(c))
                {
                        Push_F(&OPND,(float)c-48);
                        c = getchar();
                }
                else
                {
            switch(Precede(GetTop_C(OPTR),c))
            {
                case'<':
                    Push_C(&OPTR,c);
                    c = getchar();
                    break;
                case'=':
                    x = Pop_C(&OPTR);
                    c = getchar();
                    break;
                case'>':
                    theta = Pop_C(&OPTR);
                    b = Pop_F(&OPND);
                    a = Pop_F(&OPND);
                    Push_F(&OPND,Operators(a,theta,b));
            }
        }
    }
    return GetTop_F(OPND);
}

int main()
{
        printf("请输入正确的表达式以'#'结束  \n");
        InitStack_Char(&OPTR);
        Push_C(&OPTR,'#');
        InitStack_Float(&OPND);
        while(1)
        {
                printf("表达式结果是 %f\n",EvalueteExpression());
        }     
        return 0;
}


只能进行个位数的表达式求值。十位数以上就不行,改了几次都改错了。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-26 11:09:53 | 显示全部楼层
本帖最后由 梦醒尸还魂↘___ 于 2014-4-26 11:17 编辑

此帖本人在线否
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-26 12:28:49 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-26 15:04:23 | 显示全部楼层
本帖最后由 梦醒尸还魂↘___ 于 2014-4-26 15:05 编辑
a372187663 发表于 2014-4-26 12:28
在线。!!

你的代码写的太乱了,还没有注释,有点不知道所云,你讲下你的思路吧,想解决一个什么样的问题,我改了一半,改不下去了不知道你到底想干嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-26 16:26:01 | 显示全部楼层
梦醒尸还魂↘___ 发表于 2014-4-26 15:04
你的代码写的太乱了,还没有注释,有点不知道所云,你讲下你的思路吧,想解决一个什么样的问题,我改了一 ...

建立两个栈,一个运算符栈,一个运算数栈。Precede(char theta1,char theta2) //是比较两个运算符的优先级。 Operators(float a,char c,float b)//分析运算符作用  EvalueteExpression()//具体操作以及求值
   我的这个代码可以算 个位数的表达式运算  例如:3*(7-2) = 15, 1+2+3+4 =10之类的。但是只要有十位数以上的数就无能为力了 比如 88-1 在我的运行结果下 等于 7, 它出栈的时候是字符型,改了好久也没有思绪。 不知你看懂我的意思了没。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-10 16:36:13 | 显示全部楼层

很喜欢,多想分享。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 04:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表