• 栈之逆波兰


      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
  • 相关阅读:
    C# 重载,重写,代理,枚举实例
    关于C#7 新语法糖
    关于C# 异步
    经验
    C# 后台模块 Word 模板操作
    .Net 图片生成水印
    .Net XML操作
    .Net web 关于表单标题
    分页存储过程
    python 爬虫 猫眼视频榜单top100
  • 原文地址:https://www.cnblogs.com/Milkor/p/4316811.html
Copyright © 2020-2023  润新知