学习完栈可以进行表达式的计算与转换
本文实现:
中缀转前缀
中转转后缀
根据中缀计算
根据后缀计算
根据前缀计算
等将来复习到树之后,有时间把前缀后缀相互转换,以及前缀后缀转中缀实现
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;
}