中缀表达式转换后缀表达式

算法思想:

  1. 从左到右一次扫描中缀表达式的每一个字符,如果是数字字符和小数点“.”则直接将它们写入后缀表达式中,否则(遇到的是操作符)转2或3。

  2. 如果遇到的括号时:
    2.1.如果是开括号“(”,则将它们压入一个操作符栈(不需要与栈顶操作符相比较),它表明一个新的计算层次的开始;
    2.2.如果遇到的括号“)”时,将栈中的元素弹出来并放入后缀表达式中,直到栈顶元素为“(”时,将栈顶元素“(”弹出(不需要加入后缀表达式),表明这一层括号内的操作处理完毕。

  3. 如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:
    3.1 当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元素放入后缀表式, 并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作符的优先级,然后将该元素压倒栈中;
    3.2、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它直接压入栈中。

  4. 重复上述步骤直到遇到中缀表达式的结束符,弹出栈中的所有元素并放入后缀表达式中,转换结束。

代码实现:

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

int prior(char x);

int main()
{
    string input, output;
    stack<char> sym;

    while(cin >>input){
            for (size_t i = 0; i <input.length(); i++)
            {
                char tmp = input[i];
                int val = prior(tmp);
                if (val == -2) cout << tmp;
                else{
                        if (sym.empty()==true)sym.push(tmp);
                        else {
                                if (tmp=='(')
                                {
                                    sym.push(tmp);
                                    continue;
                                }
                                if (tmp ==')') {
                                    while (sym.top() != '(') { cout<<sym.top(); sym.pop(); }
                                    sym.pop();
                                    continue;
                                }
                                if (val <=(prior(sym.top())))
                                {
                                    while ((sym.empty() == false) &&( sym.top()!='(')&&( val <=prior(sym.top())))
                                    {
                                        char x = sym.top();
                                        cout << x;
                                        sym.pop();
                                    }
                                }
                                sym.push(tmp);
                                continue;
                            }
                    }
            }
        }
        while (sym.empty() == false)
        {
            char x = sym.top();
            sym.pop();
            cout << x;
        }
        cout << endl;
    return 0;
}

int prior(char x) 
{
    char add = '+', sub = '-', mutil = '*', div = '/', left = '(', right = ')',equal='=';
    if (x == equal) return -1;
    if (x == add) return 0;
    if (x == sub) return 0;
    if (x == mutil) return 1;
    if (x == div) return 1;
    if (x == left) return 2;
    if (x == right) return 2;

    return -2;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值