codeup 1918 简单计算器

 ̄綄美尐妖づ 提交于 2019-12-14 03:49:30

思路和坑:

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;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!