当前位置: 代码迷 >> 综合 >> 实现一个简单的计算器,输入一个包含圆括号、加减乘除、求余等符号组成的算术表达式字符串,输出该算术表达式的值
  详细解决方案

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

热度:11   发布时间:2024-02-27 20:57:54.0
#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;              //定义字符串指针pdouble *p3, *p4, a = 0, b = 0;  //数字栈 指针栈底p3 栈顶p4 初始化栈为空char *p1, *p2;          //符号栈 指针 栈底p1 栈顶p2 表示char stack1[20];               //定义符号栈 栈顶指针p2,栈底指针p1double stack2[20];             //定义数字栈 栈顶指针p4,栈底指针p3p1 = p2 = stack1;               // 符号栈结合栈顶p1 栈低p2p3 = 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;
}