思路和坑:
step1.中缀表达式变后缀表达式(栈)
解决两个问题,如何处理 数字, 如何处理 操作符。
1.数字直接进入后缀表达式,但是有坑!字符类型的数字在中缀中是可以区分清楚的,例如12+13但是变成后缀1213+,那么字符类型就搞不定了。所以中缀表达式中的元素类型必须为自定义node类型
2.操作符入栈,因为后缀表达式,优先级高的操作符一定在前面,所以,入栈前,需要将比该操作符高的所有操作符都出栈。
step2 计算后缀表达式(用同一个栈就可以搞定)
数字入栈
遇到操作符,让两个数字出栈,计算 》》结果入栈
代码:
// 简单计算器3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include <stack>
#include <cstring>
#include <map>
#include <cstdio>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct node {
double num;
char op;
bool isNum;
};
int main(int argc, char** argv) {
map<char, int> opMap;
opMap['+'] = 0;
opMap['-'] = 0;
opMap['*'] = 1;
opMap['/'] = 1;
while (1) {
//1.去空格
char b[1024] = { 0 };
//scanf("%s",buff);
gets_s(b);
char buff[1024] = { 0 };
int t = 0;
for (int i = 0; i < strlen(b); i++) {
if (b[i] != ' ') {
buff[t++] = b[i];
}
}
if (strlen(buff) == 0) {
break;
}
stack<node> opStack;
node behand[1024] = { 0 };
int index = 0;
//1.遍历中缀表达式
for (int i = 0; i < strlen(buff);) {
node temp;
if (buff[i] >= '0' && buff[i] <= '9') {
//是操作数
temp.isNum = true;
temp.num = buff[i++] - '0';
while (i < strlen(buff) && buff[i] >= '0' && buff[i] <= '9') {
temp.num = temp.num * 10 + (buff[i++] - '0');
}
behand[index++] = temp;
}
else {//是操作符
temp.isNum = false;
//1.退栈,把比该操作符优先级高的操作符都退到表达式中。
while (!opStack.empty() && opMap[buff[i]] <= opMap[opStack.top().op]) {
behand[index++] = opStack.top();//栈元素的类型为node
opStack.pop();
}
//2.该操作符入栈
temp.op = buff[i++];
opStack.push(temp);
}
}
while (!opStack.empty()) {
behand[index++] = opStack.top();
opStack.pop();
}
//printf("后缀表达式:%s\n",behand);
#if 0
for (int i = 0; i < index; i++) {
switch (behand[i].isNum) {
case true:
printf("%.0f", behand[i].num);
break;
case false:
printf("%c", behand[i].op);
break;
}
}
printf("\n");
#else
node temp;
for (int i = 0; i < index; i++) {
if (behand[i].isNum) {
opStack.push(behand[i]);
}
else {
double a = opStack.top().num;
opStack.pop();
double b = opStack.top().num;
opStack.pop();
switch (behand[i].op) {
case '+':
temp.num = a + b;
break;
case '-':
temp.num = b - a;
break;
case '*':
temp.num = a * b;
break;
case '/':
temp.num = b / a;;
break;
}
opStack.push(temp);
}
}
printf("%.2f\n", opStack.top().num);
#endif
}
return 0;
}
来源:CSDN
作者:无在无不在
链接:https://blog.csdn.net/weixin_43415644/article/details/103454347