1 #include<stdio.h> 2 #include<stdio.h> 3 #include<stack> //queue 4 #include<string.h> 5 using namespace std; 6 stack<char> sck1; //cal 7 stack<char> sck2; //num 8 char ss[20]; 9 void transfer(char s[20],int n) 10 { 11 int i; 12 for(i=0;i<n;i++) 13 { 14 if(s[i]==‘(‘){sck1.push(s[i]);} 15 //左括号直接放进去。 16 17 else if(s[i]==‘*‘||s[i]==‘/‘) 18 { 19 if(sck1.empty()||sck1.top()==‘+‘||sck1.top()==‘-‘) 20 { 21 sck1.push(s[i]);continue; 22 } 23 //判断如果是空的或者是栈顶是+ -的就直接放入。先进先出。注意点在于判断空得在前面。否则会报错。 24 else 25 { 26 while((!sck1.empty())&&sck1.top()!=‘(‘)//这个放到左括号也得考虑啊。 27 { 28 sck2.push(sck1.top());sck1.pop(); 29 } 30 sck1.push(s[i]); 31 } 32 //把和自己相同优先级的先拿出来。(因为是从左往右算的)。最后记得放入这个符号。 33 } 34 // * / 符号的做法 35 36 else if(s[i]==‘)‘) 37 { 38 while(sck1.top()!=‘(‘){sck2.push(sck1.top());sck1.pop();} 39 sck1.pop(); 40 } 41 // 右括号。就把运算符都放进数字栈里。直到遇到左括号。最后记得把左括号拿掉。 42 else if(s[i]==‘+‘||s[i]==‘-‘) 43 { 44 while((!sck1.empty())&&sck1.top()!=‘(‘) 45 { 46 sck2.push(sck1.top()); 47 sck1.pop(); 48 } 49 50 sck1.push(s[i]); 51 } 52 //遇到+ - 符号的话。就把符号都拿出来。最后放入自己的。因为就算相同优先级或者高的优先级。都是一样的。 53 54 else{sck2.push(s[i]);} 55 //数字的话 就直接放进数字栈了。注意不要把2个栈写反写乱了。 56 } 57 while(!sck1.empty()) 58 { 59 sck2.push(sck1.top()); 60 sck1.pop(); 61 } 62 } 63 64 int main() 65 { 66 char s[20]; 67 int n; 68 int i; 69 while(scanf("%s",s)!=EOF) 70 { 71 i = 0; 72 n = strlen(s); 73 transfer(s,n); 74 while(!sck2.empty()) 75 { 76 ss[i++] = sck2.top(); 77 sck2.pop(); 78 } 79 printf("%s\n",ss); 80 memset(ss,0,sizeof(ss)); 81 } 82 } 83 84 /* 85 1-2*3+4 86 123*-4+ 87 88 1-2+3 89 12-3+ 90 91 1-2+3-4 92 12-3+4- 93 94 ((1+2)+3)*4 95 12+3+4* 96 97 (1+2)*(3-4) 98 12+34-* 99 100 (1+2)*((1+2)+3)*4 101 12+12+3+*4* 102 103 mark 104 number 1 2 * 105 判空 106 */
时间: 2024-10-19 23:03:57