理论原理:
本博客采用STL中的栈实现,各位小伙伴在理解原理后可尝试使用自己书写的栈实现。
代码实现:
#include <iostream>
#include <string>
#include <stack>
using namespace std;
//判断是否是数字
bool isNumber(char c)
{
return c >= '0' && c <= '9';
}
//判断是否是左括号
bool isLeft(char c)
{
return c == '(';
}
//判断是否是右括号
bool isRight(char c)
{
return c == ')';
}
//判断是否是运算符
bool isOperator(char c)
{
return c == '+' || c == '-' || c == '*' || c == '/';
}
//对数字的操作
void numberOperate(char c)
{
cout<<c;
}
//对左括号的操作
void leftOperate(char c,stack<char> &stack)
{
stack.push(c);
}
//对右括号的操作
void rightOperate(stack<char> &stack)
{
while(stack.size()>0)
{
char c=stack.top();
stack.pop();
if(isLeft(c))
break;
cout<<c;
}
}
//获取运算符优先级
int operatePriority(char c)
{
//一定要将0作为最低,其余运算符正常
//将"("作为0,是为了防止在运算符操作时将其弹出
switch (c)
{
case '+':
return 1;
case '-':
return 1;
case '*':
return 2;
case '/':
return 2;
default:
return 0;
}
}
//对运算符的操作
void operatorOperate(char c,stack<char> &stack)
{
//将优先级等级比自己高的弹出,再入栈
int priority=operatePriority(c);
while(stack.size() > 0)
{
char sc=stack.top();
if(priority > operatePriority(sc))
{
break;
}
cout<<sc;
stack.pop();
}
stack.push(c);
}
int main()
{
string s="8+(3-1)*5";
// string s="9+(6+5)*2-7";
stack<char> stack;
for(unsigned int i=0;i<s.size();i++)
{
char c=s.at(i);
if(isNumber(c))
numberOperate(c);
if(isLeft(c))
leftOperate(c,stack);
if(isRight(c))
rightOperate(stack);
if(isOperator(c))
operatorOperate(c,stack);
}
while (stack.size() > 0)
{
char sc=stack.top();
cout<<sc;
stack.pop();
}
cout<<endl;
return 0;
}
运行结果: