• C语言计算前缀表达式


    算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

    输入格式:

    输入在一行内给出不超过30个字符的前缀表达式,只包含+-*以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

    输出格式:

    输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR

    输入样例:

    + + 2 * 3 - 7 4 / 8 4
    

    输出样例:

    13.0

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef struct node *Node;
    struct node {
    float num;
    char operators;
    int flag;
    Node Next;
    };
    Node ReadData(void);
    Node Function(Node);
    float Coculate(char,float,float);
    int main() {
    struct node head;
    Node temp=&head;
    do {
    temp->Next=ReadData();
    temp=temp->Next;
    } while(getchar()!=' ');
    temp->Next=NULL;

    temp=&head;
    while(temp->Next) {
    if(temp->Next&&temp->Next->Next&&temp->Next->Next->Next) {
    if(temp->Next->flag==1&&temp->Next->Next->flag==0&&temp->Next->Next->Next->flag==0) {

    float sum=Coculate(temp->Next->operators,temp->Next->Next->num,temp->Next->Next->Next->num);
    if(sum==99999)break;
    temp->Next->Next->Next->num=sum;
    temp->Next=temp->Next->Next->Next;
    temp=&head;
    } else temp=temp->Next;
    } else break;
    }
    if(head.Next->Next) {
    printf("ERROR");
    } else printf("%.1f",head.Next->num);
    return 0;
    }

    float Coculate(char c,float a,float b) {
    float sum;
    switch(c) {
    case '+':
    sum=a+b;
    break;
    case '-':
    sum=a-b;
    break;
    case '*':
    sum=a*b;
    break;
    case '/':
    if(!b)return 99999;
    sum=a/b;
    break;
    default :
    sum=99999;
    break;
    }
    return sum;
    }
    Node ReadData(void) {
    char a[31];
    Node temp=(Node)malloc(sizeof(struct node));
    scanf("%s",a);
    int len=strlen(a);
    if(len==1) {
    switch(a[0]) {
    case '+':
    case '-':
    case '*':
    case '/':
    temp->operators=a[0];
    temp->flag=1;
    break;
    default:
    temp->num=a[0]-'0';
    temp->flag=0;
    break;
    }
    } else {
    temp->num=0;
    temp->flag=0;
    if(a[0]>='0'&&a[0]<='9') {
    int i=0;
    for(; i<len&&a[i]!='.'; i++) {
    temp->num*=10;
    temp->num+=a[i]-'0';
    }
    float xiaoshu=1;
    for(++i; i<len; i++) {
    xiaoshu*=0.1;
    temp->num+=xiaoshu*(a[i]-'0');
    }
    } else {
    int i=1;
    for(; i<len&&a[i]!='.'; i++) {
    temp->num*=10;
    temp->num+=a[i]-'0';
    }
    float xiaoshu=1;
    for(++i; i<len; i++) {
    xiaoshu*=0.1;
    temp->num+=xiaoshu*(a[i]-'0');
    }
    if(a[0]=='-')temp->num*=-1;
    }
    }

    return temp;

    }

     
  • 相关阅读:
    设计模式——代理模式
    设计模式——建造者模式
    设计模式——模板方法
    springboot+mybatis项目自动生成
    【小坑】java下载excel文件
    设计模式——工厂方法模式 和 抽象工厂模式
    设计模式——单例模式
    容易忽略的递归当中的return
    Android 4.0以后正确的获取外部sd卡存储目录
    Android 串口设置校验位、速率、停止位等参数
  • 原文地址:https://www.cnblogs.com/didiaoxiaoguai/p/7544263.html
Copyright © 2020-2023  润新知