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 }

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

  • 相关阅读:
    共享纸巾更换主板代码分析 共享纸巾主板更换后的对接代码
    Python Django Ajax 传递列表数据
    Python Django migrate 报错解决办法
    Python 创建字典的多种方式
    Python 两个list合并成一个字典
    Python 正则 re.sub替换
    python Django Ajax基础
    Python Django 获取表单数据的三种方式
    python Django html 模板循环条件
    Python Django ORM 字段类型、参数、外键操作
  • 原文地址:https://www.cnblogs.com/shihuajie/p/2619438.html
Copyright © 2011-2022 走看看