一開始想的時候,我走了歪路,一直想把一個表達式放進棧,後來看了網上的才知道放運算符也行,就試着做了一下,果然比放表達式簡單多
大緻思想:
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;
}