您的位置:首页 > 理论基础 > 数据结构算法

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

2017-05-25 22:54 645 查看
学习完栈可以进行表达式的计算与转换

本文实现:

中缀转前缀

中转转后缀

根据中缀计算

根据后缀计算

根据前缀计算

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

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() <
a150
< endl;
cout << "后缀:" << ec.getSuffix() << endl;
cout << "中缀计算:" << ec.calcuateInfix() << endl;
cout << "前缀计算:" << ec.calcuatePrefix() << endl;
cout << "后缀计算:" << ec.calcuateSuffix() << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐