c++后缀表达式转中缀表达式简略实现

本文简要介绍了C++如何将后缀表达式转换为中缀表达式,作者主要实现了基本的加减乘除和括号操作,并使用1+2*3+(4*5+6)*7作为测试用例。代码实现未涵盖更复杂的测试场景。


一,中缀后缀表达式转换原理,网上的相关解释很多,我参考的是这一篇

链接直接跳转到我参考的文章

二,中缀表达式转后缀表达式的实现

我只实现了基本的+-*/()这几个符号,以后自己如果需要可能会加

我用的是1+2*3+(4*5+6)*7这个表达式进行测试,本人较懒,不打算测试更多

话不多说,贴代码

//
// Created by jiahang on 2018/5/23.
// 完成简单的后缀表达式,可以进行+-*/的后缀表达式生成
// 存在一些cast问题,没有处理
//
#include <iostream>
#include <string>
#include <stack>

using namespace std;
void suffix() {
    int value = 0;
    stack<char> s;
    string input;
    cin >> input;
    for (int i = 0; i < input.length(); i++) {
        int j = i;
        value = 0;
        bool hasNumber = false;
        //从input的起点开始,进行判断
        for (; j < input.length(); j++) {
            //从字符串中读取数字
            if (input.at(j) <= '9' && input.at(j) >= '0') {
                //如果下表所在的地方是数字,就更新value
                hasNumber = true;
                value += 10 * value + input.at(j) - '0';
            } else {
                break;
            }
        }
        if (hasNumber) {
            //进行这个判断是为了防止出现即使上一个字串不是数值,也会输出一个value=0的情况
            cout << value << " ";//输出一个值加一个空格
            hasNumber = false;
        }
        //解释一下为什么要进行下面这个判断,因为在上面的一层循环中,会使得j=input.length()
        //如果在这里直接把j赋值给i,就会造成下标越界,因此判断到最后一个数字之后,应当把
        //i=input.length()-1作为正确的处理方式
        if(j<input.length()){
            i = j;//把j所在的下标,就是不是数字的下标给i
        }
        else{
            i= static_cast<int>(input.length() - 1);//这一段会有unsigned转int的警告,静态cast处理一下
        }
        char temp = input.at(i);
        if (temp == '(') {
            //由于左括号的优先级最高,所以栈中一定是优先级更低的
            // 所以遇到左括号就直接入栈
            s.push(temp);
        } else if (temp == '+' || temp == '-') {
            //由于+-的优先级最低,因此,遇到了加减,肯定是要把栈中所有的东西输出,除非遇到了(
            //然后把+-压入
            while (!s.empty() && s.top() != '(') {
                cout << s.top() << " ";
                s.pop();
            }
            s.push(temp);
        } else if (temp == ')') {
            //遇到右括号的时候一直弹出,直到遇到左括号
            while (s.top() != '(' && !s.empty()) {
                //防止用户输入错误,导致括号不匹配的现象,因此也加入栈空的判断
                cout << s.top() << " ";
                s.pop();
            }
            if (!s.empty()) {
                s.pop();//由于左括号不输出,也弹出一次
            }
            //右括号本身也不输出
        } else if (temp == '*' || temp == '/') {
            //当遇到*/的时候,要弹出直到遇到(,+,-
            while (!s.empty() && (s.top() == '*' || s.top() == '/')) {
                cout << s.top() << " ";
                s.pop();
            }
            s.push(temp);
        }
    }
    while (!s.empty()) {
        cout << s.top() << " ";
        s.pop();
    }
}

int main(void){
    suffix();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值