#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;
}
实现一个简单的计算器,输入一个包含圆括号、加减乘除、求余等符号组成的算术表达式字符串,输出该算术表达式的值
最新推荐文章于 2021-11-19 22:00:55 发布