[数据结构]表达式的计算与转换-C++
2017-05-25 22:54
645 查看
学习完栈可以进行表达式的计算与转换
本文实现:
中缀转前缀
中转转后缀
根据中缀计算
根据后缀计算
根据前缀计算
等将来复习到树之后,有时间把前缀后缀相互转换,以及前缀后缀转中缀实现
ExpressionCalcuate.h:
ExpressionCalcuate.cpp:
main.cpp(测试):
本文实现:
中缀转前缀
中转转后缀
根据中缀计算
根据后缀计算
根据前缀计算
等将来复习到树之后,有时间把前缀后缀相互转换,以及前缀后缀转中缀实现
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; }
相关文章推荐
- 逆波兰表达式 转换和计算 C++实现
- 【数据结构】用栈实现的简单计算器(先转换为后缀表达式、可以计算带括号的)
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- 数据结构—中缀表达式转后缀表达式算法及实现—栈的应用—计算表达式(C++代码实现)(1)
- 数据结构--表达式计算
- 用c++写的将数学表达式转换为结果的代码(如输入1+(2*9-5)= 14)
- 中缀表达式转换成后缀表达式,进行简单表达式的计算
- C++实现简易表达式的计算(操作室为10以内)
- 中缀表达式的计算,C++版本,Linux环境
- 一个基于LL(1)的简易C++四则表达式计算
- 反向LL(1)预测分析法的简易C++四则表达式计算
- 关于java 的科学计算算法(前,中,后缀表达式的转换)——计算器制作的心得
- 栈应用之中缀转后缀表达式计算(C++、JAVA)
- 顺序表C++数据结构实验之栈二:一般算术表达式转换成后缀式
- C++程序设计实验报告(十六)----用循环控制语句编写程序,完成表达式的计算
- 中缀表达式转换为逆波兰表达式(C++)
- C++正则表达式使用实例--实现一个markdown代码标记转换工具
- C++输出回文数用循环控制语句编写程序,完成表达式的计算
- 数据结构--后缀表达式转树(c++)