栈之逆波兰

  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
",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   */
View Code
原文地址:https://www.cnblogs.com/Milkor/p/4316811.html