Launchauto 2015-09-20 10:36 采纳率: 0%
浏览 4515
已结题

C语言数据结构:表达式求值代码问题

要求允许小数,过滤空格,可以+ - * /和求指数
图片说明

#include
#include
#include
#include
#define true 1
#define false 0
#define OPSETSIZE 8 //运算符集合数为8

char OPSET[OPSETSIZE] = { '+', '-', '*', '/', '(', ')', '#', '^' };
unsigned char Prior[8][8] =
{ /**********运算符优先级表***********/
// '+' '-' '*' '/' '(' ')' '#' '^'
/*'+'*/ '>', '>', '<', '<', '<', '>', '>', '<',
/*'-'*/ '>', '>', '<', '<', '<', '>', '>', '<',
/*'*'*/ '>', '>', '>', '>', '<', '>', '>', '<',
/*'/'*/ '>', '>', '>', '>', '<', '>', '>', '<',
/*'('*/ '<', '<', '<', '<', '<', '=', ' ', '<',
/*')'*/ '>', '>', '>', '>', ' ', '>', '>', '>',
/*'#'*/ '<', '<', '<', '<', '<', ' ', '=', '<',
/*'^'*/ '>', '>', '>', '>', '<', '>', '>', '>'
};

typedef int Status;
typedef struct StackChar
{
char oper;
struct StackChar next;
}SC; //StackChar类型的结点SC
typedef struct StackDouble
{
double num;
struct StackDouble *next;
}SD; //StackDouble类型的结点SD
/
********FUN:SC类型的指针入栈,返回p **********/
SC Push(SC *s, char oper)
{
SC *p = (SC
)malloc(sizeof(SC));
p->oper = oper;
p->next = s;
return p;
}
/***********FUN:SC类型的指针出栈**************/
SC Pop(SC *s)
{
SC *q = s;
s = s->next;
free(q);
return s;
}
/
*********FUN:SF类型的指针入栈,返回p********/
SD Push(SD *s, double num)
{
SD *p = (SD
)malloc(sizeof(SD));
p->num = num;
p->next = s;
return p;
}
/**************FUN:SF类型的指针出栈**********/
SD Pop(SD *s)
{
SD *q = s;
s = s->next;
free(q);
return s;
}
/
***************FUN:计算 aθb 的逻辑操作****************/
double Calculator(double a, unsigned char theta, double b)
{
switch (theta)
{
case '+': return a + b;
case '-': return a - b;
case '*': return a*b;
case '/': return a / b;
case '^': return pow(a, b);
default: return 0;
}
}
/***********Fun:判断输入运算符是否为8种标准运算符********/
Status Judge(char Test, char TestOp)
{
int i;
int Find = false;
for (i = 0; i< OPSETSIZE; i++)
{
if (Test == TestOp[i])
Find = true;
}
return Find;
}
/
*************Fun:返回输入运算符的设定数值**************/
Status ReturnOpOrd(char oper, char TestOp)
{
int i;
for (i = 0; i< OPSETSIZE; i++)
{
if (oper == TestOp[i])
return i;
}
}
/
*********FUN:比较运算符优先级**********/
char Precede(char Aop, char Bop)
{
return Prior[ReturnOpOrd(Aop, OPSET)][ReturnOpOrd(Bop, OPSET)];
}
/*************FUN:表达式求值*************/
double EvaluateExpression(char* Expression)
{
// OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合
SC *OPTR = NULL; // 运算符栈,字符元素
SD *OPND = NULL; // 运算数栈,实数元素
char TempData[20] = ""; // 以字符形式临时存储数据
double Data, a, b;
char pc[50] = "", *c;
char theta, Dr[] = { '#', '\0' };

c = pc;

OPTR = Push(OPTR, '#');    //起始符#入栈
*c = strcat_s(Expression, sizeof(Expression), Dr);   //表达式追加尾部#

while (*c != '#' || OPTR->oper != '#')
{
    if (!Judge(*c, OPSET))
    {
        Dr[0] = *c;
        strcat_s(TempData, sizeof(TempData), Dr);           //字符串连接函数 
        c++;
        if (Judge(*c, OPSET))
        {
            Data = (double)atof(TempData);       //字符串转换函数
            OPND = Push(OPND, Data);
            strcpy_s(TempData,sizeof(TempData)," \0");                         //清空临时存放数据的字符串
        }
    }
    else    // 不是运算符则进栈 
    {
        switch (Precede(OPTR->oper, *c))
        {
        case '<': // 栈顶元素优先级低 
            OPTR = Push(OPTR, *c);
            c++;
            break;
        case '=': // 脱括号并接收下一字符 
            OPTR = Pop(OPTR);
            c++;
            break;
        case '>': // 退栈并将运算结果入栈 
            theta = OPTR->oper;
            OPTR = Pop(OPTR);
            b = OPND->num;
            OPND = Pop(OPND);
            a = OPND->num;
            OPND = Pop(OPND);
            OPND = Push(OPND, Calculator(a, theta, b));
            break;
        }
    }
}
return OPND->num;

}

int main(void)
{
char s[128];
puts("请输入表达式:");
gets_s(s);
puts("该表达式的值为:");
printf("%s =%lf\n", s, EvaluateExpression(s));
system("pause"); //Press any key to exit
return 0;
}

  • 写回答

2条回答 默认 最新

  • JarenLin 2015-09-20 13:00
    关注

    小白路过,你的gets_s函数在哪?

    评论

报告相同问题?

悬赏问题

  • ¥15 shape_predictor_68_face_landmarks.dat
  • ¥15 slam rangenet++配置
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题