思路其实都是一样,主要主要细节
如-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; }