天天看點

c++ 算術表達式轉字尾表達式

一開始想的時候,我走了歪路,一直想把一個表達式放進棧,後來看了網上的才知道放運算符也行,就試着做了一下,果然比放表達式簡單多

大緻思想:

1、遇到字母就入result字元數組

2、根據運算符優先級:*/+-(降序)

我們在周遊數組A過程中,如果此時數組的元素為運算符且在棧不為空的時候,優先級大于棧頂元素,就入棧

優先級小于棧頂元素,就先彈棧,并将彈出的壓入result,再将此時周遊到的壓入棧

如果周遊數組A時,遇到‘(’    ')' 這兩個符号,執行continue

3、根據以上規則,寫循環

#include<iostream>
#include<vector>
#include<stack>
using namespace std;
void solve()
{
	static vector<char> A { 'a', '+', 'b', '*', 'c' };//abc*+
	static vector<char> B;
	static stack<char> C;
	for (int i = 0; i < A.size(); i++)
	{
		if (A[i] != '+' && A[i] != '-'  && A[i] != '*' && A[i] != '/' && A[i] != '(' && A[i] != ')')
		{
			B.push_back(A[i]);
		}
		else if (C.empty() && (A[i] - '+'==0 || A[i] - '-'==0 || A[i] - '*'==0 || A[i] - '/'==0))
			C.push(A[i]);
		else if (!C.empty() && (A[i] - '+' == 0 || A[i] - '-' == 0 || A[i] - '*' == 0 || A[i] - '/' == 0))
		{
			if (C.top() == '*')
			{
				C.pop();
				B.push_back('*');
				C.push(A[i]);
			}
			else if (C.top() == '/' && (A[i] - '+'==0 || A[i] - '-'==0))
			{
				C.pop();
				B.push_back('/');
				C.push(A[i]);
			}
			else if (C.top() == '/' && A[i]  == '*' )
			{
				C.push(A[i]);
			}
			else if (C.top() - '+'==0 && A[i] - '-'==0)
			{
				C.pop();
				B.push_back('+');
				C.push(A[i]);
			}
			else if (C.top() - '+' == 0 && (A[i] == '*' || A[i] == '/' ))
			{
				C.push(A[i]);
			}
			else if (C.top() - '-'==0)
			{
				C.pop();
				B.push_back('-');
				C.push(A[i]);
			}
			else if (A[i] - '('==0 || A[i] - ')'==0)
			{
				continue;
			}
			else
			{
				continue;
			}
		}
	}
	for (int i = 0; i < B.size(); i++)
		cout << B[i] << "  ";
	while(!C.empty())
	{
		cout << C.top() << "  ";
		C.pop(); 
	}
}
int main()
{
	solve();
	system("pause");
	return 0;
}
           

繼續閱讀