C++ 栈的应用-中缀转后缀

理论原理:

本博客采用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;
}

运行结果:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值