2021-04-18

中缀表达式转后缀表达式和计算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;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aiyouzichano

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值