qq_35488174 2016-07-03 15:29 采纳率: 0%
浏览 2260

c语言数据结构 表达式求值

目的:1)掌握栈的概念与基本操作;
2)掌握文本文件的读写操作。
要求:实现任意加、减、乘、除与括号的表达式求值;
输入输出格式要求如下:
输入文件input.txt内容:
2*(4-100)=
3*5+9/3=
100-20*(4*6/3)=
输出文件output.txt内容(output.txt文件为自动生成,若已存在则覆盖):
2*(4-100)=-192
3*5+9/3=18
100-20*(4*6/3)=-60

求大神帮帮咯

代码如下,就是不会写文件那部分:
#include
#include
#define MAX 20
//定义第一个栈---作为存放运算数的操作符
struct SNode_Num
{
int datas[MAX];
int top;
};
typedef struct SNode_Num OperateNum;

//定义第二个栈---作为存放运算符号的栈
struct SNode_Symbol
{
char symbol[MAX];
int top;
};
typedef struct SNode_Symbol OperateSymbol;

/********************************************************************
描述:定义函数:InitOperandNum,并且初始化运算数栈顶
参数:OperateNum StackNum
返回值:void
*
******************************************************************/
void InitOperateNum(OperateNum *StackNum)
{
StackNum->top = -1;
}

/********************************************************************
描述:定义函数: InitOperateSymbol,并且初始化运算符栈顶
参数:OperateSymbol StackSymbol
返回值:void
*
******************************************************************/
void InitOperateSymbol(OperateSymbol *StackSymbol)
{
StackSymbol->top = -1;
}

/********************************************************************
描述:定义函数:PushOperateNum, 压一个数到栈顶
参数:OperateNum StackNum, int x
返回值:void
*
******************************************************************/
void PushOperateNum(OperateNum *StackNum, int x)
{
StackNum->top++;
StackNum->datas[StackNum->top] = x;
}

/********************************************************************
描述:定义函数:PushOperateSymbol,压一个运算符到栈顶
参数:OperateSymbol StackSymbol, char ch
返回值:void
*
******************************************************************/
void PushOperateSymbol(OperateSymbol *StackSymbol, char ch)
{
StackSymbol->top++;
StackSymbol->symbol[StackSymbol->top] = ch;
}

/********************************************************************
描述:定义函数:PopOperateNum,将运算数从栈中读取出来
参数:OperateNum StackNum
返回值:返回取出来的数
*
******************************************************************/
int PopOperateNum(OperateNum *StackNum)
{
int num;
num = StackNum->datas[StackNum->top];
StackNum->top--;
return num;
}

/********************************************************************
描述:定义函数:PopOperateSymbol,将运算符从栈中取出来
参数:OperateSymbol StackSymbol
返回值:返回取出来的符号
*
******************************************************************/
char PopOperateSymbol(OperateSymbol *StackSymbol)
{
char ch;
ch = StackSymbol->symbol[StackSymbol->top];
StackSymbol->top--;
return ch;
}

//取出相应的数
int GetOperateNum(OperateNum *StackNum)
{
return StackNum->datas[StackNum->top];
}

//取出相应运算符
char GetOperateSymbol(OperateSymbol *StackSymbol)
{
return StackSymbol->symbol[StackSymbol->top];
}

/********************************************************************
描述:定义函数, IsOperateSymbolOrNum,判断输入的符号是那些符号
参数:char ch
返回值:有符号返回1,无符号返回0
********************************************************************/
short IsOperateSymbolOrNum(char ch)
{
//判断所有需要用的操作符 包括 + - * / ( ) \n
if(ch == '+' || ch == '-' || ch == '*'
|| ch == '/' || ch == '(' || ch == ')' || ch == '\n') return 1;

else return 0;  

}

/********************************************************************
描述:定义函数: Priority,用于判断符号优先级运算
参数:char inputnum, char ch
返回值:符号的大小的字符
********************************************************************/
char Priority(char inputnum, char ch)
{
switch(inputnum)
{
//加减在同一个优先级上
case '+':
case '-':
{
if(ch == '+' || ch == '-') return '>';
else if(ch == '*' || ch == '/') return '<';
else if(ch == '(') return '<';
else if(ch == ')') return '>';
else return '>';

}
break;

    //乘除在同一优先级 
    case '*':
    case '/':
    {
        if(ch == '+' || ch == '-') return '>';
        else if(ch == '*' || ch == '/') return '>';
        else if(ch == '(') return '<';
        else if(ch == ')') return '>';
        else return '>';
    }
        break;

    //括号在所有优先级以上 
    case '(':
    {
        if(ch == ')') return '=';
        else return '<';
    }
        break;
    case ')':
    {
        return '>';
    }
        break;
    case '\n':
    {
        if(ch == '\n') return '=';
        else return '<';
    }
        break;  
}

}

/********************************************************************
描述:定义函数: Calculate,计算结果
参数:int num1, char ch, int num2
返回值:返回两个数计算的结果result
********************************************************************/
int Calculate(int num1, char ch, int num2)
{
int result;
switch(ch)
{
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
}
return result;
}

/********************************************************************
描述:定义函数:MainCalc,主要用于获取用户输入,并且进行计算
参数:void
返回值:result
********************************************************************/
int MainCalc()
{
//主函数进行计算
OperateNum datas;
OperateSymbol symbol;
int num1, num2, result, num;
char ch, sign;

InitOperateNum(&datas);
InitOperateSymbol(&symbol);


//把回车计算的操作符放在栈中 
PushOperateSymbol(&symbol, '\n');
ch = getchar();
while((ch != '\n') || (GetOperateSymbol(&symbol) != '\n'))
{
    if(!IsOperateSymbolOrNum(ch))
    {
        num = atoi(&ch);  //将字符转换为整数
        ch = getchar();   //获取输入
        while(!IsOperateSymbolOrNum(ch))
        {
            num = num * 10 + atoi(&ch);
            ch = getchar();   //当没有输入回车时,继续获取输入
        } 
        PushOperateNum(&datas, num);            
    }
    else
    {
        switch(Priority(GetOperateSymbol(&symbol), ch))
        {
            //判断优先级后进行计算 
            case '<':
                PushOperateSymbol(&symbol, ch);
                ch = getchar();
                break;
            case '=':
                sign = PopOperateSymbol(&symbol);
                ch = getchar();  //获取输入
                break;
            case '>':
                sign = PopOperateSymbol(&symbol);
                num2 = PopOperateNum(&datas);
                num1 = PopOperateNum(&datas);
                result = Calculate(num1, sign, num2);
                PushOperateNum(&datas, result);
                break;

        }
    } 
} 
result = GetOperateNum(&datas);
return result;

}

int main(int argc, char *argv[])
{
int result;
printf("请输入运算式:\n");
result = MainCalc();
printf("结果为:\n");
printf("%d\n", result); //输出结果

return 0;

}

  • 写回答

3条回答 默认 最新

  • Robot-S 2016-07-03 15:31
    关注

    表达式求值头文件
    #ifndef HEADEXP_H_INCLUDED
    #define HEADEXP_H_INCLUDED

    #include
    #include
    #include

    #define MAX 20

    int GetNumFromStr( char str[] , int pos , float* num ) ;
    int GetOperateF......
    答案就在这里:数据结构c语言实现表达式求值
    ----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

    评论

报告相同问题?

悬赏问题

  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常