[C ++] Implemente una calculadora con dos pilas

Implementación de una calculadora con programación de dos pilas

No se juzga si la cuerda es razonable.

Regla: Cree dos pilas, una pila de números y una pila de operadores.
Expresiones aritméticas de cadena transversal: 1 + 2 * (3 + 4 * 5)
1. Cuando se encuentra una cadena numérica, se convierte directamente en un número y se inserta en la pila de números.
(Considere cómo la cadena "1234" se convierte a tipo int 1234).

2. Haga una división de nivel
para "+, - ,, /, (,)". unordered_map <char, int> map = {{'(', 0}, {'+', 1}, {'-', 1}, {' ', 2}, {'/', 2}, {' ) ', 3}};

3. Cuando se atraviesa el primer carácter de operador, se debe empujar directamente a la pila de operadores (es decir, se considera que se atraviesa el primer carácter no numérico y que la pila de operadores está vacía, y se empuja a la pila ).

4. Cuando el carácter del operador transversal sea el paréntesis izquierdo, empújelo directamente en la pila.

5. Cuando el operador transversal es el paréntesis de cierre, se calcula la expresión aritmética entre paréntesis. (Reducido a un subproblema)

6. Compare el nivel de operador atravesado con el elemento superior de la pila de operadores. Si el nivel de operador actual es más pequeño que el elemento superior de la pila, saque dos pilas de números y una pila de operadores para realizar operaciones aritméticas. De ida y vuelta. Finalmente, inserte el carácter actual en la pila de operadores

7. Después de recorrer la cadena aritmética, finalmente juzgue si la pila de operadores está vacía, no vacía, y realice los cálculos.

5 y 6 se describen en detalle como sigue:

Al ejecutar "1 + 2 + 3 + 4":
Inserte la descripción de la imagen aquí
Al atravesar los primeros 3 caracteres, utilice las reglas 1 y 3 para realizar la operación, y el resultado es el que se muestra en la figura anterior.
Inserte la descripción de la imagen aquí
Al pasar al cuarto carácter '+', use las reglas 2 y 6 para ejecutar, y el resultado es como se muestra en la figura siguiente. Lo
Inserte la descripción de la imagen aquí
mismo es cierto, y el resultado es como se muestra en la figura siguiente, no hay más explicación
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Usando la regla 7, el resultado final es 10
Inserte la descripción de la imagen aquí

Al ejecutar "1 + 2 * 3 + 4":
Inserte la descripción de la imagen aquí
Al recorrer los primeros 3 caracteres, utilice las reglas 1 y 3 para realizar la operación, y el resultado es el que se muestra en la figura anterior.

Inserte la descripción de la imagen aquí
Al pasar al cuarto carácter '*', use las reglas 2, 6 para ejecutar, y el resultado es el que se muestra a continuación.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Finalmente, después de atravesar la cadena, use la regla 7 para ejecutar el resultado como se muestra en la figura siguiente
Inserte la descripción de la imagen aquí

Al ejecutar "1 + 2 * (3 + 4 * 5)"
Inserte la descripción de la imagen aquí
al atravesar los primeros 3 caracteres, utilice las reglas 1 y 3 para realizar la operación, y el resultado es el que se muestra en la figura anterior.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Finalmente, presentaré el código:

Calculadora.h :

#pragma once
#include<iostream>
#include<stack>
#include<string>
#include<unordered_map>
using namespace std;
class Calculator
{
    
    
private:
	stack<int> numbers;
	stack<char>operators;
	string str;
	unordered_map<char, int>map;
public:
	Calculator();
	Calculator(string str);

	void set(string str);
	int get();
	int result();
	bool isdight(char c);

};

Calculadora.cpp:

#include "Calculator.h"

Calculator::Calculator()
{
    
    
	map = {
    
     {
    
    '(',0},{
    
    '+',1},{
    
    '-',1},{
    
    '*',2},{
    
    '/',2},{
    
    ')',3} };
}

Calculator::Calculator(string str)
{
    
    
	map = {
    
     {
    
    '(',0},{
    
    '+',1},{
    
    '-',1},{
    
    '*',2},{
    
    '/',2},{
    
    ')',3} };
	set(str);
}

void Calculator::set(string str)
{
    
    
	this->str = str;
}

int Calculator::get()
{
    
    
	int i = 0, len = str.length();
	int priority_top, priority_cur;//记录栈顶操作符元素和当前操作符对应map大小
	while (i < len) {
    
    
		if (isdight(str[i])) {
    
    
			int sum = 0;
			while (i < len && isdight(str[i])) {
    
    
				sum = 10 * sum + (str[i] - '0');
				i++;
			}
			numbers.push(sum);
		}
		else {
    
    
			if (operators.empty()) {
    
    
				operators.push(str[i]);
				i++;
				continue;
			}
			priority_top = map[operators.top()];
			priority_cur = map[str[i]];
			if (priority_cur == 0) {
    
    
				operators.push(str[i]);
			}
			else if (priority_cur == 3) {
    
    
				while (operators.top() != '(') {
    
    
					numbers.push(result());
				}
				operators.pop();
			}
			else {
    
    
				while (!operators.empty() && priority_cur <= priority_top) {
    
    
					numbers.push(result());
					if (!operators.empty())
						priority_top = map[operators.top()];
				}
				operators.push(str[i]);
			}
			i++;

		}
		
	}
	while (!operators.empty()) {
    
    
		numbers.push(result());
	}
	int num = numbers.top();
	numbers.pop();
	return num;
}

int Calculator::result()
{
    
    
	int b = numbers.top();
	numbers.pop();
	int a = numbers.top();
	numbers.pop();
	char c = operators.top();
	operators.pop();
	switch (c) {
    
    
	case '+':
		return a + b;
	case '-':
		return a - b;
	case '*':
		return a * b;
	case '/':
		return a / b;
	}
}

bool Calculator::isdight(char c)
{
    
    
	if (c <= '9' && c >= '0') {
    
    
		return true;
}
	return false;
}

prueba:

#include<iostream>
using namespace std;
#include"Calculator.h"
int main() {
    
    
	Calculator cal;
	cal.set("1+2*(3+4*5)");
	cout << cal.get();
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_48180029/article/details/115217262
Recomendado
Clasificación