C语言实现四则运算(小型计算器)

来源:互联网 发布:周思成网络课程百度云 编辑:程序博客网 时间:2024/05/18 21:39
如果有更好的想法,随时欢迎私我!
#include <stdio.h>#include <stdlib.h>#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;//取出相应的数int GetOperateNum(OperateNum *StackNum){    return StackNum->datas[StackNum->top];}//取出相应运算符char GetOperateSymbol(OperateSymbol *StackSymbol){    return StackSymbol->symbol[StackSymbol->top];}//运算数进栈void PushOperateNum(OperateNum *StackNum, int x){    StackNum->top++;    StackNum->datas[StackNum->top] = x;}//运算符进栈void PushOperateSymbol(OperateSymbol *StackSymbol, char ch){    StackSymbol->top++;    StackSymbol->symbol[StackSymbol->top] = ch;}//运算数退栈int PopOperateNum(OperateNum *StackNum){    int num;    num = StackNum->datas[StackNum->top];    StackNum->top--;    return num;}//运算符退栈char PopOperateSymbol(OperateSymbol *StackSymbol){    char ch;    ch = StackSymbol->symbol[StackSymbol->top];    StackSymbol->top--;    return ch;}//判断输入的符号是否是四则运算符号int IsOperateSymbolOrNum(char ch){    if(ch == '+' || ch == '-' || ch == '*'|| ch == '/' || ch == '\n') return 1;    else return 0;}//判断符号的优先级char Priority(char inputnum, char ch){    switch(inputnum)    {        //加减在同一个优先级上        case '+':        case '-':        {            if(ch == '+' || ch == '-') return '>';            else if(ch == '*' || ch == '/') return '<';            else return '>';        }            break;        //乘除在同一优先级        case '*':        case '/':        {            if(ch == '+' || ch == '-') return '>';            else if(ch == '*' || ch == '/') return '>';            else return '>';        }            break;        case '\n':        {            if(ch == '\n') return '=';            else return '<';        }            break;    }}//两数运算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;}//用于用户输入和计算结果int MainCalc(){    //主函数进行计算    OperateNum datas;    OperateSymbol symbol;    int num1, num2, result, num;    char ch, sign;//初始化顺序栈datas.top=-1;//操作数栈顶指针symbol.top=-1;//操作符栈顶指针    //把回车计算的操作符放在栈中    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        {//考虑第一个数是负数的情况if(ch=='-'&&symbol.top==0&&datas.top==-1)PushOperateNum(&datas, 0);            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;    result = MainCalc();    printf("%d", result);  //输出结果    return 0;}

原创粉丝点击