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

题目简述:

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

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

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

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

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

首先,对于括号(),(*、/)号和(+、-)号分别赋予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;
}
上一篇:流程控制函数if 的作用


下一篇:Shell脚步编程