鱼C论坛

 找回密码
 立即注册
查看: 2001|回复: 6

急!

[复制链接]
发表于 2020-11-8 16:06:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
那个大佬能写出逆波兰计算器可以算出((2*2)^(1+2/1)*60/2+1)*3+10624/2/2/2 的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-8 20:55:51 | 显示全部楼层

回帖奖励 +10 鱼币

//逆波兰计算器(后缀表达式)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<ctype.h>//isdigit(c)函数的头文件,用于判断传入的字符c是否为"0-9"的数字字符

#define STACK_INIT_SIZE 20 //栈的初始空间大小
#define STACKINCREMENT 10    //增量,用于追加额外空间

typedef double ElemType;

typedef struct{
    ElemType *base;//栈底指针
    ElemType *top;//栈顶指针
    int stackSize;
}sqStack;

//初始化栈
void InitStack(sqStack &s){
    s.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if( !s.base )
        exit(0);
    s.top = s.base;
    s.stackSize = STACK_INIT_SIZE;
}

//元素入栈
void Push(sqStack &s, ElemType e){
    if( s.top-s.base >= s.stackSize ){
        s.base = (ElemType *)realloc(s.base, (s.stackSize+STACKINCREMENT)*sizeof(ElemType));
        if( !s.base )
            exit(0);
    }
    *s.top = e;
    s.top++;
}

//元素出栈
void Pop(sqStack &s, ElemType &e){
    if( s.top == s.base )
        return ;
    e = *--s.top;
}

//返回栈的当前容量
int StackLen(sqStack s){
    return (s.top-s.base);
}

int main(){
    printf("\n假设用逆波兰表达式计算:(1-2)*(4+5)= ?   ---- 运算结果应为-9.000000\n");
    sqStack s;
    InitStack(s);
    char c;
    double d,e;//支持小数数据的运算,定义成double类型
    char str[10];
    int i = 0;
    printf("\n\n请按逆波兰表达式输入待计算的数据,数据与运算符之间用空格隔开,以‘#’作为结束标志\n");
    scanf("%c",&c);
    while( c != '#' ){
        while( isdigit( c ) || c == '.' ){//数据缓冲区,isdigit()检查参数c是否为阿拉伯数字0到9(字符数字)
            str[i++] = c;//如果是数字 字符,将字符存放数组里
            if( i >= 10){//规定每个数字的位数小于10
                printf("出错:输入的单个数据过大!\n");
                return -1;
            }
            scanf("%c",&c);
            if(c == ' '){//如果输入空格,表示一个数据输入结束,将数据元素入栈
                d = atof(str);//用于将字符串转换为双精度浮点数(double)
                Push(s,d);//遇到数字就入栈,此时入栈的是double类型的数字,不是字符
                i = 0;
                break ;//跳出while循环
            }
        }

        switch( c ){
            case '+':
                Pop(s,e);
                Pop(s,d);//弹出栈顶两个元素
                Push(s,d+e);//相加
                break ;
            case '-':
                Pop(s,e);
                Pop(s,d);
                Push(s,d-e);//相减
                break ;
            case '*':
                Pop(s,e);
                Pop(s,d);
                Push(s,d*e);//相乘
                break ;
            case '/':
                Pop(s,e);
                Pop(s,d);
                if( e != 0 )
                    Push(s,d/e);//相除
                else{
                    printf("\n错误:除数不为零!");
                    return -1;
                }
                break ;
        }
        scanf("%c",&c);
    }

    Pop(s,d);//最后一个元素出栈就是最终的运算结果
    printf("\n最终的运算结果为:%f",d);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

 楼主| 发表于 2020-11-8 21:02:44 | 显示全部楼层

这个并没有指数运算啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-8 21:04:37 | 显示全部楼层

回帖奖励 +10 鱼币

这也不是逆波兰表达式啊……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-8 21:06:00 | 显示全部楼层
jpan1221 发表于 2020-11-8 21:02
这个并没有指数运算啊

这个没有指数运算?那 ^ 是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-9 09:30:25 | 显示全部楼层
赚点鱼币QAQ
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-9 11:53:16 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-11-8 21:06
这个没有指数运算?那 ^ 是什么

楼主说的是2楼给出的代码没有实现指数运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 17:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表