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

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

这里写图华国锋描述

代码如下:

#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;
}

数据测试在上图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值