zoukankan      html  css  js  c++  java
  • nyoj128 前缀式计算

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<stdlib.h>
      4 #define N 1010
      5 char s[N];
      6 //数字栈的操作
      7 typedef struct
      8 {
      9   float *base;
     10   float *top;
     11 }SqStack;
     12 int InitStack(SqStack &S)
     13 {
     14   S.base=(float *)malloc(N/2*sizeof(float));
     15   S.top=S.base;
     16   return 1;
     17 }
     18 float GetTop(SqStack S)
     19 {
     20     float e;
     21     if(S.top==S.base)  return 0;
     22     e=*(S.top-1);
     23     return e;
     24 }
     25 int Push(SqStack &S,float e)
     26 {
     27   *S.top++=e;
     28   return 1;
     29 }
     30 int Pop(SqStack &S,float &e)
     31 {
     32   if(S.top==S.base) return 0;
     33   e=*--S.top;
     34   return 1;
     35 }
     36 //转化的操作过程 
     37 float Operate(float a,char theta,float b)
     38 {
     39     switch(theta){
     40         case '+': return a+b;
     41         case '-': return a-b;
     42         case '*': return a*b;
     43         case '/': return a/b;
     44         default: return 0;
     45     }
     46 }
     47 int level(char c)
     48 {
     49     switch(c){
     50         case ' ': return 1;
     51         case '+':
     52         case '-': return 3;
     53         case '*':
     54         case '/': return 4;
     55         default : return 0;
     56     }
     57 }
     58 float EvaluateExpression()
     59 {
     60     SqStack OPND;
     61     InitStack(OPND);
     62     bool flag;
     63     float k,t; 
     64     char *p=s+strlen(s)-1;
     65     char c=*p;
     66     while(p!=s){
     67         flag=0;
     68         if(!level(c)){
     69             k=c-'0';
     70             c=*--p;
     71             flag=1;
     72         }
     73         if(c!=' '){
     74             for(t=k;*p!='.';p--)
     75                 t=0.1*t+*p-'0';
     76             t*=0.1;
     77             c=*--p;
     78             k=c-'0';
     79             Push(OPND,k+t);
     80             p--;
     81         }
     82         else if(flag) Push(OPND,k);
     83         c=*--p;
     84         while(level(c)==3||level(c)==4){
     85             Pop(OPND,k);
     86             Pop(OPND,t);
     87             Push(OPND,Operate(k,c,t));
     88             if(p==s) break;
     89             c=*--p;
     90         }
     91     }
     92     return GetTop(OPND);
     93 }
     94 //主函数
     95 int main()
     96 {
     97     while(gets(s))
     98         printf("%.2f\n",EvaluateExpression());
     99     return 0;
    100 }

    本题我利用了前缀式倒过来恰好是后缀式的形式,然后就可用一个数字栈进行处理了,但把字符串倒置过来的同时,数字特别是小数也倒置过来了,所以我把时间花在了处理一个颠倒数字上!!

  • 相关阅读:
    VS工作目录,输出目录
    Google的C++开源代码项
    C++文件读写
    深拷贝浅拷贝
    Efficient Graph-Based Image Segmentation
    Graph Cut 简介
    Graph Cut
    "GrabCut" - Interactive Foreground Extraction using Iter
    EM算法
    Python图像处理库(2)
  • 原文地址:https://www.cnblogs.com/shihuajie/p/2619438.html
Copyright © 2011-2022 走看看