中缀表达式转为后缀表达式 ---- 栈

题目:给一个中缀表达式(即标准形式的表达式),打印该表达式的后缀表达式。中缀表达式最大的不一样就是去掉了表示运算符优先级的括号。操做数为26个小写或大写的英文字母(注意不包括数字和其余字符),操做符为+,-,*,/,(,),^,=,一共八个。具体见例子见下图 :ios

这里写图华国锋描述

代码以下:web

#include <iostream>
#include <string>
#include <stack>

using namespace std;

/* 判断字符ch是不是一个操做数 */
bool IsOperand(char ch)
{
    return (ch>='a' && ch<='z') || (ch>='A' && ch<='Z');
}

/* 返回操做数的等级 */
int GetRange(char oper)
{
    switch (oper)
    {
    case '+':
    case '-':return 0;
    case '^':
    case '*':
    case '/':return 1; 
    case '(':
    case '#':return -1;
    }//凡是进栈的都要有等级
}

/* 把中缀转化为后缀并输出 */
void InfixToPostfix(string str)
{
    cout << str << "----> ";

    int len = str.size();

    stack<char> s;
    s.push('#');

    for (int i = 0; i < len; i++)
    {
        if (str[i] == '=')
        {
            while (s.top() != '#')
            {
                cout << s.top();
                s.pop();
            }
            cout << str[i];
        }
        else if (IsOperand(str[i]))
            cout << str[i];
        else
        {
            if (str[i] == '(')
                s.push(str[i]);
            else if (GetRange(str[i]) <= GetRange(s.top()))
            {
                while (GetRange(str[i]) <= GetRange(s.top()))
                {
                    cout << s.top();
                    s.pop();
                }
                s.push(str[i]);
            }
            else if (str[i] == ')')
            {
                while (s.top() != '(')
                {
                    cout << s.top();
                    s.pop();
                }
                s.pop();//删掉'('
            }
            else
                s.push(str[i]);
        }
    }//for (int i = 0; i < len; i++)

    while (s.top() != '#')
    {
        cout << s.top();
        s.pop();
    }

    cout << endl;
}

int main()
{
    string str1 = "a+b*c+(d*e+f)*g";
    string str2 = "X=A+B*(C-D)/E";
    string str3 = "(a*b)^a=c^d";

    InfixToPostfix(str1);
    InfixToPostfix(str2);
    InfixToPostfix(str3);

    return 0;
}

数据测试在上图。svg

相关文章
相关标签/搜索