【数据结构】NOJ008—逆波兰式

栈的三大应用例题:

(1)逆波兰式:一个数字栈

链接:(63条消息) 【数据结构】NOJ008—逆波兰式_杨的博客-CSDN博客

(2)中缀表达式计算:一个数字栈和一个运算符栈

链接:(63条消息) 【数据结构】【拓展题】【01】中缀表达式计算_杨的博客-CSDN博客

(3)逆波兰式计算:一个数字栈

链接:(63条消息) 【数据结构】【拓展题】【02】逆波兰式计算_杨的博客-CSDN博客

题目简述:

 解析:

本题重点在于对题目的分析和想到解决方法。

容易想到,可以转换成对二叉树的存储,原式是中序遍历,转换成后序遍历,输出节点即可。

难点在于怎么处理表达式和括号的优先级问题。

首先,对于括号(),(*、/)号和(+、-)号分别赋予3、2和1的优先级。遍历字符串,

(1)如果遇到字母,则直接输出

(2)如果遇到运算符,判断其与当前栈顶符号的优先级:

          ——读入的新运算符优先级高就继续将运算符入栈;

          ——反之输出栈内的运算符,直到遇到一个比自己优先级低的或者栈已经为空(即大于等于自己优先级的运算符都要输出)就把自己压进栈,

          ——同时,如果遇到右括号”)“,就把栈内运算符按顺序输出直到遇到(,把(出栈后停止。

(3)读完所有字符串后,将栈内运算符全出栈即可。

重点:

(1)了解解题思路;

(2)理解对栈的操作

代码:

#include <iostream>
#include<stack>
#include<string>
using namespace std;

void InitStack(stack<char>stk)
{
    while(!stk.empty())
        stk.pop();
}

int Prior(char ch)
{
    if(ch=='(')
        return 2;
    else if(ch=='*'||ch=='/')
        return 1;
    else
        return 0;
}
void Reverse_Polish(stack<char>stk,string expr,int len)
{
    for(int i=0;i<len;i++)
    {
        //cout<<"当前判断的字符是:";
        //cout<<expr[i]<<endl;
        if(expr[i]<='z'&&expr[i]>='a')
            cout<<expr[i];
        else
        {
            if(expr[i]==')')
            {
                //一直出栈直到遇到(
                while(stk.top()!='(')
                {
                    cout<<stk.top();
                    stk.pop();
                }
                stk.pop();//将(也出栈
            }
            else
            {

                if(stk.empty()||Prior(expr[i])>Prior(stk.top())||stk.top()=='(')
                {
                    //cout<<"该字符入栈"<<endl;
                    stk.push(expr[i]);
                }

                else
                {
                    //当前读入优先级<=栈顶,则一直弹出,直到遇到大于自己的或栈已经为空
                    //最后把自己放进去
                    while(1)
                    {
                        if(!stk.empty()&&Prior(stk.top())>=Prior(expr[i]))
                        {
                            cout<<stk.top();
                            stk.pop();
                        }
                        else
                        {
                            //直到遇到比自己优先级低的,把自己放进去
                            stk.push(expr[i]);
                            break;
                        }


                    }
                }
            }
        }
    }
    while(!stk.empty())
    {
        cout<<stk.top();
        stk.pop();
    }
}
int main()
{
    stack<char>stk;
    string expr;
    cin>>expr;
    int len=expr.size();

    //初始化栈
    InitStack(stk);

    Reverse_Polish(stk,expr,len);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值