中缀表达式转后缀表达式和计算c++17
#include <cctype>
#include <iostream>
#include <iomanip>
#include <string>
#include <conio.h>
#include <ctime>
#include <cmath>
#include <vector>
#include <algorithm>
#include <functional>
#include <numeric>
#include <list>
#include <deque>
#include <stack>
#include <map>
using std::cout;
using std::cin;
using std::endl;
double todouble(const std::string& str)
{
double temp = 0;
for (auto ch : str)
{
temp = temp * 10 + ((double)ch - (double)'0');
}
return temp;
}
int main()
{
std::string str = "1*2+4+(2+6)/2";
std::vector<std::string> test;
std::string temp = "";
std::string temp_ = "";
for (auto ch : str)
{
if (isdigit(ch) || ch == '.')
{
temp += ch;
}
else
{
if (!temp.empty())
{
test.push_back(temp);
temp.clear();
}
temp_.clear();
test.push_back(temp_ + ch);
}
}
if (!temp.empty())
{
test.push_back(temp);
temp.clear();
}
cout << "test:" << endl;
for (auto str : test)
{
cout << str << " ";
}
cout << endl;
std::stack<std::string> assist;
std::vector<std::string> endtest;
for (auto str : test)
{
if (str == "+" || str == "-")
{
if (assist.empty()) {
assist.push(str);
}
else
{
while (!assist.empty())
{
if (assist.top() == "(")
{
assist.pop();
break;
}
else
{
endtest.push_back(assist.top());
assist.pop();
}
}
assist.push(str);
}
}
else if (str == "*" || str == "/")
{
if (assist.empty()) {
assist.push(str);
}
else
{
while (!assist.empty())
{
if (assist.top() == "(")
{
assist.pop();
break;
}
else if (assist.top() == "+" || assist.top() == "-")
{
break;
}
else
{
endtest.push_back(assist.top());
assist.pop();
}
}
assist.push(str);
}
}
else if (str == "(")
{
assist.push(str);
}
else if (str==")")
{
while (assist.empty())
{
if (assist.top() == "(")
{
assist.pop();
break;
}
else
{
endtest.push_back(assist.top());
assist.pop();
}
}
}
else
{
endtest.push_back(str);
}
}
while (!assist.empty())
{
endtest.push_back(assist.top());
assist.pop();
}
cout << "endtest:" << endl;
for (auto YY : endtest)
{
cout << YY << " ";
}
cout << endl;
double o1, o2;
std::stack<double> assist_;
for (auto str : endtest)
{
if (str == "+")
{
o1 = assist_.top();
assist_.pop();
o2 = assist_.top();
assist_.pop();
assist_.push(o2+o1);
}
else if (str == "-")
{
o1 = assist_.top();
assist_.pop();
o2 = assist_.top();
assist_.pop();
assist_.push(o2 - o1);
}
else if (str == "*")
{
o1 = assist_.top();
assist_.pop();
o2 = assist_.top();
assist_.pop();
assist_.push(o2 * o1);
}
else if (str == "/")
{
o1 = assist_.top();
assist_.pop();
o2 = assist_.top();
assist_.pop();
assist_.push(o2 / o1);
}
else
{
assist_.push(todouble(str));
}
}
double res = assist_.top();
cout << "res=" << res << endl;
return EXIT_SUCCESS;
}