逆波兰表达式
-
这个主要是对栈的应用,如果不了解栈的同学先去了解一下栈哦,如果了解了,就当这句话不存在;
-
是数字的话直接入栈;
-
遇到运算符的话出栈2个数字进行运算,前者对后者进行运算;
-
运算后的结果继续入栈;
-
下面给出代码
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#define STACK_INIT_SIZE 200
#define STACKINCREMENT 100
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));
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)));
}
*(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() {
sqStack s;
char c;
double d,e;
char str[STACKINCREMENT];
int i=0;
InitStack (&s);
printf("请按逆波兰表达式输入计算数据,用空格隔开,以“#”结束\n");
scanf("%c",&c);
while(c!='#') {
while( isdigit(c) || c=='.') {
str[i++]=c;
str[i]='\0';
scanf("%c",&c);
if(c==' ') {
d=atof(str);
Push(&s,d);
i=0;
break;
}
}
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("除数是0!\n");
return -1;
}
break;
}
scanf("%c",&c);
}
Pop(&s,&d);
printf("最终结果为 %f\n",d);
}
isdight()函数是判断字符是否为十进制数字字符,在头文件<ctype.h>里面;
atof ()函数是将字符串化为浮点型,在头文件<stdlib.h>里面;