逆波兰计算器
2016-07-22 21:37
459 查看
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<ctype.h> #define Stack_size 20 #define Stack_increasesize 20 #define MAX 50 typedef double Element; typedef struct node{ Element *base; Element *top; int size; }Stack; void InitialStack(Stack *s) { s->base=(Element *)malloc(sizeof(Element)*Stack_size); if(!s->base) exit(0); s->top=s->base; s->size=Stack_size; } void Push(Stack *s,Element e) { if((s->top-s->base)==s->size) { s->base=(Element *)realloc(s->base,(Stack_size+Stack_increasesize)*sizeof(Element)); if(!s->base) exit(0); s->size=Stack_size+Stack_increasesize; } *(++s->top)=e; } void Pop(Stack *s,Element *e) { if(s->base==s->top) return; else *e=*(s->top--); } int Length(Stack s) { return (s.top-s.base); } int main() { Stack S; char c,s[MAX]; double a,b; int i=0; InitialStack(&S); printf("输入后缀表达式,字符与字符之间用空格分开:\n"); scanf("%c",&c); while(c!='\n') { while(isdigit(c)||c=='.') { s[i++]=c; scanf("%c",&c); if(c==' ') { s[i]='\0'; a=atof(s); Push(&S,a); i=0; break; } } switch(c) { case'-': Pop(&S,&a); Pop(&S,&b); Push(&S,b-a); break; case'+': Pop(&S,&a); Pop(&S,&b); Push(&S,b+a); break; case'*': Pop(&S,&a); Pop(&S,&b); Push(&S,b*a); break; case'/': Pop(&S,&a); Pop(&S,&b); if(a) Push(&S,b/a); else { printf("除数不能为0\n"); return -1; } break; } scanf("%c",&c); } Pop(&S,&a); printf("结果是:%f\n",a); return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言二进制思想以及数据的存储