题目:对任意给定的一个中缀算术表达式,输出等价的后缀形式

//  中缀表达式转后缀表达式
//  操作符:+、-、*、/、%
//  输入:可以用cin.getline(arr, 250)或者cin.get(ch) && ch != '\n'
//  测试数据:输入格式:(注意:不能有中文的操作符)
//           2+(3+4)*5
//           16+2*30/4
//      输出格式:
//          2 3 4 + 5 * +
//          16 2 30 * 4 / +
 
#include <iostream>
#include <stack>
#include <string>
#include<string.h>
using namespace std;
 
// 判断是否是操作符
bool isOperator(char ch) {
    if(ch == '+' || ch == '-' || ch == '*' || ch == '/')
        return true;
    return false; // 否则返回false
}
 
// 获取优先级
int getPriority(char ch) {
    int level = 0; // 优先级
    
    switch(ch) {
        case '(':
            level = 1;
            break;
        case '+':
        case '-':
            level = 2;
            break;
        case '*':
        case '/':
            level = 3;
            break;
        default:
            break;
    }
    return level;
}
 
int main(int argc, const char * argv[]) {
    // insert code here...
    int num;
    char arr[250]; // 一个一个的读取表达式,直到遇到'\0'
    std::stack<char> op; // 栈op:存储操作符
    
    while(1) {
    	cout<<"请输入一个中缀表达式"<<endl; 
        cin.getline(arr,250);
        cout<<"后缀表达式为:"<<endl; 
        int len, i;
        char c; // c存储从栈中取出的操作符
        
        len = (int)strlen(arr); // strlen()输出的是:unsigned long类型,所以要强制转换为int类型
        i = 0;
        while(i < len) {
            if(isdigit(arr[i])) { // 如果是数字
                num = 0;
                do {
                    num = num * 10 + (arr[i] - '0'); // ch - 48根据ASCAII码,字符与数字之间的转换关系
                    i++; // 下一个字符
                }while(isdigit(arr[i]));
                cout << num << " ";
            } else if(arr[i] == '(') { // (:左括号
                op.push(arr[i]);
                i++;
            } else if(isOperator(arr[i])) { // 操作符
                if(op.empty()) {// 如果栈空,直接压入栈
                    op.push(arr[i]);
                    i++;
                }
                else {
                    // 比较栈op顶的操作符与ch的优先级
                    // 如果ch的优先级高,则直接压入栈
                    // 否则,推出栈中的操作符,直到操作符小于ch的优先级,或者遇到(,或者栈已空
                    while(!op.empty()) {
                        c = op.top();
                        if(getPriority(arr[i]) <= getPriority(c)) {
                            // 优先级低或等于
                            cout << c << " ";
                            op.pop();
                        } else // ch优先级高于栈中操作符
                            break;
                    } // while结束
                    op.push(arr[i]); // 防止不断的推出操作符,最后空栈了;或者ch优先级高了
                    i++;
                } // else
            } else if(arr[i] == ')') { // 如果是右括号,一直推出栈中操作符,直到遇到左括号(
                while(op.top() != '(') {
                    cout << op.top() << " ";
                    op.pop();
                }
                op.pop(); // 把左括号(推出栈
                i++;
            } else // 如果是空白符,就进行下一个字符的处理
                i++;
        } // 第二个while结束
        while(!op.empty()) { // 当栈不空,继续输出操作符
            cout << op.top() << " ";
            op.pop();
        }
        cout << endl;
        
    } // 第一个while结束
    return 0;
}

打印结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗯嗯,是楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值