|
发表于 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;
- }
复制代码 |
|