PAT 表达式转换

思路其实都是一样,主要主要细节

如-2*(+3)这样的需要考虑正负号

如1.236*4.5需要考虑小数点

如123这样的考虑数需要连贯


下面附上代码和测试数据

-2*(+2) .--------            -2 2 *

1.236*2.368--------------- 1.236 2.368  *

((4+5)*9-(8+2))/5 ---------------- - 4 5 + 9 * 8 2 + - 5 /
123456   -------------- 123456
下面附上代码
#include <iostream>
#include <sstream>
#include <cstring>
#include <stack>
#include <queue>
using namespace std;
int PriOrity(char c,char d){
    if(c == '+' || c == '-'){
        return 0;
    }else{
        if(d == '+' || d == '-'){
            return 1;
        }else{
            return 0;
        }
    }

}
bool isNum(char c){
    if(c <= '9' && c >= '0'){
        return true;
    }
    return false;

}
int main(){
    string s;
    string k;
    cin>>s;
    stack<char> dev;
    char out[5050];
    int t = 0;
    for(int i = 0 ;i < s.length() ;i++){
        if(s[i] == '-' && !isNum(s[i-1]) || s[i] == '-' && i == 0 ){//判断Y的是不是一个负数
                out[t++] = s[i];//是-号的话就直接放进去
                continue;
        }else if(isNum(s[i])){//判断数字
            while(isNum(s[i])||s[i] == '.'){//如果是数字或者小数点,通通放进去
               out[t++] = s[i];
               i++;
            }
            out[t++] = ' ';//加个空格区分
            i--;
        }else if(s[i] == '+' && s[i-1] == '('){//如果是类似+2的情况不要+号了
                continue;
        }
        else if(s[i] == '(' || dev.empty()){//是左括号或者空栈直接入
            dev.push(s[i]);
        }else if(s[i] == ')'){//是右括号的话就开始栈直到为左括号
            while(dev.top() != '('){
               out[t++] = dev.top();
               out[t++] = ' ';
                dev.pop();
            }
            dev.pop();
        }else{
           if(PriOrity(s[i],dev.top()) == 1 ){//如果优先级大,直接入栈
                dev.push(s[i]);
           }else{
                while( dev.size() && dev.top() != '('){//如果优先级小,因为每一次的入栈都会弹出大的,直接弹道为括号为止
                            out[t++] = dev.top();
                            out[t++] = ' ';
                            dev.pop();
                }
                dev.push(s[i]);
           }
        }
    }
    if(dev.empty()){//考虑(+2)的情况
        for(int i = 0 ;i < t-1 ;i++){
            cout<<out[i];
        }
        cout<<endl;
    }
    else{//最后一个去空格加换行符就好了
            while(dev.size() ){
            out[t++] = dev.top();
            out[t++] = ' ';
            dev.pop();
        }
        for(int i = 0 ;i < t-1 ;i++){
            cout<<out[i];
        }
        cout<<endl;

    }
    return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值