[数据结构]表达式的计算与转换-C++

本文介绍了一种使用栈实现表达式计算与转换的方法,包括中缀转前缀、中缀转后缀及相应的计算过程。通过具体的代码示例,展示了如何进行表达式的解析和计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习完栈可以进行表达式的计算与转换

本文实现:

中缀转前缀

中转转后缀

根据中缀计算

根据后缀计算

根据前缀计算


等将来复习到树之后,有时间把前缀后缀相互转换,以及前缀后缀转中缀实现



ExpressionCalcuate.h:

#pragma once
#include<string>
#include<iostream>
#include <stack> 
using namespace std;

class ExpressionCalcuate {
private:
	string prefix;	//前缀
	string suffix;	//后缀
	string infix;	//中缀
public:
	void setPrefix(string prefix);
	void setSuffix(string suffix);
	void setInfix(string infix);
	string getPrefix();
	string getSuffix();
	string getInfix();
	bool infixToPrefix();				//中缀转前缀
	bool infixToSuffix();				//中缀转后缀
	int calcuatePrefix();				//前缀计算
	int calcuateSuffix();				//后缀计算
	int calcuateInfix();				//中缀计算
	bool calcuateOnce(stack<int> &numStack, stack<char> &signStack);
};



ExpressionCalcuate.cpp:

#include"ExpressionCalcuate.h"

void ExpressionCalcuate::setPrefix(string prefix) {
	this->prefix = prefix;
}

void ExpressionCalcuate::setSuffix(string suffix) {
	this->suffix = suffix;
}

void ExpressionCalcuate::setInfix(string infix) {
	this->infix = infix;
}

string ExpressionCalcuate::getPrefix(){
	return this->prefix;
}

string ExpressionCalcuate::getSuffix() {
	return this->suffix;
}

string ExpressionCalcuate::getInfix() {
	return this->infix;
}

bool ExpressionCalcuate::infixToPrefix() {
	stack<char> signStack;
	stack<char> res;
	string result = "";
	for (int i = infix.size()-1; i >-1; i--) {
		char c = infix[i];
		if (c >= '0'&&c <= '9') {
			res.push(c);
		}
		else if (c == '+' || c == '-') {
			bool flag = true;
			while (flag) {
				if (signStack.empty() || signStack.top() == ')'||
					signStack.top() == '+' || signStack.top() == '-') {
					signStack.push(c);
					flag = false;
				}
				else {
					res.push(signStack.top());
					signStack.pop();
				}
			}
		}
		else if (c == '*' || c == '/') {
			bool flag = true;
			while (flag) {
				if (signStack.empty() || signStack.top() == ')' ||
					signStack.top() == '+' || signStack.top() == '-'||
					signStack.top() == '/' || signStack.top() == '*') {
					signStack.push(c);
					flag = false;
				}
				else {
					res.push(signStack.top());
					signStack.pop();
				}
			}
		}
		else if (c == ')') {
			signStack.push(c);
		}
		else if (c == '(') {
			while (signStack.top() != ')') {
				res.push(signStack.top());
				signStack.pop();
			}
			signStack.pop();
		}
		
	}
	while (!signStack.empty()) {
		res.push(signStack.top());
		signStack.pop();
	}
	while (!res.empty()) {
		result += res.top();
		res.pop();
	}
	this->prefix = result;
	return true;
}

bool ExpressionCalcuate::infixToSuffix() {
	stack<char> signStack;
	string result="";
	for (int i = 0; i < infix.size(); i++) {
		char c = infix[i];
		if (c >= '0'&&c <= '9') {
			result += c;
		}
		else if (c == '+'||c=='-') {
			bool flag = true;
			while (flag) {
				if (signStack.empty() || signStack.top() == '(') {
					signStack.push(c);
					flag = false;
				}
				else {
					result += signStack.top();
					signStack.pop();
				}
			}
		}
		else if (c == '*'||c == '/') {
			bool flag = true;
			while (flag) {
				if (signStack.empty() || signStack.top() == '('||
					signStack.top()=='+'||signStack.top()=='-') {
					signStack.push(c);
					flag = false;
				}
				else {
					result += signStack.top();
					signStack.pop();
				}
			}
		}
		else if (c == '(') {
			signStack.push(c);
		}
		else if (c == ')') {
			while (signStack.top() != '(') {
				result += signStack.top();
				signStack.pop();
			}
			signStack.pop();
		}
	}
	while (!signStack.empty()) {
		result += signStack.top();
		signStack.pop();
	}
	this->suffix = result;
	return true;
}

int ExpressionCalcuate::calcuatePrefix() {
	stack<int> numStack;
	for (int i = prefix.size()-1; i>-1; i--) {
		char c = prefix[i];
		if (c >= '0'&&c <= '9') {
			int num = c - '0';
			numStack.push(num);
		}
		else {
			int a = numStack.top();
			numStack.pop();
			int b = numStack.top();
			numStack.pop();
			if (c == '+') {
				numStack.push(a + b);
			}
			else if (c == '-') {
				numStack.push(a - b);
			}
			else if (c == '*') {
				numStack.push(a * b);
			}
			else if (c == '/') {
				numStack.push(a / b);
			}
		}

	}
	return numStack.top();
}

int ExpressionCalcuate::calcuateSuffix() {
	stack<int> numStack;
	for (int i = 0; i < suffix.size(); i++) {
		char c = suffix[i];
		if (c >= '0'&&c <= '9') {
			int num = c - '0';
			numStack.push(num);
		}
		else {
			int b = numStack.top();
			numStack.pop();
			int a = numStack.top();
			numStack.pop();
			if (c == '+') {
				numStack.push(a + b);
			}
			else if (c == '-') {
				numStack.push(a - b);
			}
			else if (c == '*') {
				numStack.push(a * b);
			}
			else if (c == '/') {
				numStack.push(a / b);
			}
		}

	}
	return numStack.top();
}

int ExpressionCalcuate::calcuateInfix() {
	stack<int> numStack;
	stack<char> signStack;
	for (int i = 0; i < infix.size(); i++) {
		char c = infix[i];
		if (c >= '0'&&c <= '9') {
			int num = c - '0';
			numStack.push(num);
		}
		else if (c == '+') {
			bool flag = true;
			while (flag) {
				if (signStack.empty() || signStack.top() == '(') {
					signStack.push(c);
					flag = false;
				}
				else {
					calcuateOnce(numStack, signStack);
				}
			}
		}
		else if (c == '-') {
			bool flag = true;
			while (flag) {
				if (signStack.empty() || signStack.top() == '(' || signStack.top() == '+') {
					signStack.push(c);
					flag = false;
				}
				else {
					calcuateOnce(numStack, signStack);
				}
			}
		}
		else if (c == '*') {
			bool flag = true;
			while (flag) {
				if (signStack.empty() || signStack.top() == '(' ||
					signStack.top() == '+' || signStack.top() == '-') {
					signStack.push(c);
					flag = false;
				}
				else {
					calcuateOnce(numStack, signStack);
				}
			}
		}
		else if (c == '/') {
			bool flag = true;
			while (flag) {
				if (signStack.empty() || signStack.top() == '(' ||
					signStack.top() == '+' || signStack.top() == '-' || signStack.top() == '*') {
					signStack.push(c);
					flag = false;
				}
				else {
					calcuateOnce(numStack, signStack);
				}
			}
		}
		else if (c == '(') {
			signStack.push(c);
		}
		else if (c == ')') {
			while (signStack.top() != '(') {
				calcuateOnce(numStack, signStack);
			}
			signStack.pop();
		}
	}
	while (!signStack.empty()) {
		calcuateOnce(numStack, signStack);
	}
	return numStack.top();
}


bool ExpressionCalcuate::calcuateOnce(stack<int> &numStack, stack<char> &signStack) {
	int b = numStack.top();
	numStack.pop();
	int a = numStack.top();
	numStack.pop();
	char c = signStack.top();
	signStack.pop();
	if (c == '+') {
		numStack.push(a + b);
	}
	else if (c == '-') {
		numStack.push(a - b);
	}
	else if (c == '*') {
		numStack.push(a * b);
	}
	else if (c == '/') {
		numStack.push(a / b);
	}
	return true;
}


main.cpp(测试):

#include<iostream>
#include"ExpressionCalcuate.h"
using namespace std;

void main() {
	ExpressionCalcuate ec;
	ec.setInfix("(3+4-4/2)*5-6");
	ec.infixToPrefix();
	ec.infixToSuffix();
	cout <<"中缀:"<< ec.getInfix() << endl;
	cout << "前缀:" << ec.getPrefix() << endl;
	cout << "后缀:" << ec.getSuffix() << endl;
	cout << "中缀计算:" << ec.calcuateInfix() << endl;
	cout << "前缀计算:" << ec.calcuatePrefix() << endl;
	cout << "后缀计算:" << ec.calcuateSuffix() << endl;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值