逆波兰表达式(后缀表达式的计算*C语言介绍)

逆波兰表达式

  • 这个主要是对栈的应用,如果不了解栈的同学先去了解一下栈哦,如果了解了,就当这句话不存在;

  • 是数字的话直接入栈;

  • 遇到运算符的话出栈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>里面;

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ac011_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值