#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;
}
详细解决方案
实现一个简单的计算器,输入一个包含圆括号、加减乘除、求余等符号组成的算术表达式字符串,输出该算术表达式的值
热度:11 发布时间:2024-02-27 20:57:54.0