PAT 表达式转换

来源:互联网 发布:淘宝模特拍摄价格 编辑:程序博客网 时间:2024/05/24 00:47

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

如-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 0
原创粉丝点击