实现一个简单的计算器,输入一个包含圆括号、加减乘除、求余等符号组成的算术表达式字符串,输出该算术表达式的值

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int Preemption(char a, char b)   //符号优先级比较,a为当前读入,b为栈顶元素
{
    int c;          //c反馈指令信息 0.结束 1.弹出 2.进栈 3.删除当前元素及栈顶元素 4.报错
    switch (a) {
        case '#':   //输入的符号位#,则程序开始运算结果,并输出出来,程序结束
            if (b == '#') c = 0;
            else c = 1;
            break;
        case '+':
            if (b == '#' || b == '(') c = 2;//字符为+号,则c为2,数值开始进栈
            else c = 1;
            break;
        case '-':
            if (b == '#' || b == '(') c = 2;//字符为-号,则c为2,数值开始进栈
            else c = 1;
            break;
        case '*':
            if (b == '*' || b == '/') c = 1;//字符为*号,则c为1,数值开始进栈
            else c = 2;
            break;
        case '/':
            if (b == '*' || b == '/') c = 1;//字符为/号,则c为1,数值开始进栈
            else c = 2;
            break;
        case '(':           //字符为(号,则c为2,优先开始运算( )字符
            c = 2;
            break;
        case ')':
            if (b == '(') c = 3;  //字符为()号,则c为3 小括号里的运算结束 ,弹出数值
            else c = 1;
            break;
        default :
            c = 4; //若都没有正确,则显示报错信息
            printf("输入信息错误,请重新开始输入!");
            break;
    }
    return c;  //返回数值C 看是否能进行下一步的程序运算
}

//主函数运行调用
int main() {
    char str[50] = {"\0"};      //定义一个长度为50的字符变量数组
    char *p = str;              //定义字符串指针p
    double *p3, *p4, a = 0, b = 0;  //数字栈 指针栈底p3  栈顶p4  初始化栈为空
    char *p1, *p2;          //符号栈 指针 栈底p1  栈顶p2  表示
    char stack1[20];               //定义符号栈 栈顶指针p2,栈底指针p1
    double stack2[20];             //定义数字栈 栈顶指针p4,栈底指针p3
    p1 = p2 = stack1;               //  符号栈结合栈顶p1  栈低p2
    p3 = p4 = stack2;               //  数字栈结合 栈顶p3  栈低p4
    *p2++ = '#';            //符号栈 栈顶p2先被赋值为#,然后进行值得增加,知道#号出现才停止增加
    printf("请输入需要计算的算术表达式:");
    gets(str);      //获取输入的运算字符
    strcat(str, "#"); //输入的为#号时,则输入结束,开始输出结果
    while (*p != '\0') {     //当指针不为0时,开始循环
        if (*p <= '9' && *p >= '0') {   //输入的数值,需要是在0-9之间的个位数
            a = a * 10 + (*p - '0');    //
            if (*(p + 1) > '9' || *(p + 1) < '0') { //
                *p4++ = a;
                a = 0;
            }
            p++;
        } else {
            switch (Preemption(*p, *(p2 - 1))) {    //符号栈 栈顶指针为0,则输出结果,说明需要输入的运算已经输入完毕
                case 0:
                    printf("计算结果为:%lf\n", *p3);
                    p++;
                    break;
                case 1:                         //栈顶值为1 ,则数字栈开始减少
                    b = *--p4;
                    switch (*(--p2)) {
                        case '+':
                            *(p4 - 1) = *(p4 - 1) + b;
                            break;
                        case '*':
                            *(p4 - 1) = *(p4 - 1) * b;
                            break;
                        case '-':
                            *(p4 - 1) = *(p4 - 1) - b;
                            break;
                        case '/':
                            *(p4 - 1) = *(p4 - 1) / b;
                            break;
                    }
                    break;
                case 2:
                    *p2++ = *p++;
                    break;
                case 3:
                    p++;
                    p2--;
                    break;
                case 4:
                    printf("程序读到了无法计算的符号,出错了\n");
                    p++;
                    break;
            }
        }
    }
    return 0;
}


  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值