数据结构——后缀表达式

4.99 1.06 * 5.99 + 6.99 1.06 * +

这个记法叫作后缀表达式或逆波兰记法,其求值过程是将4.99 和 1.06压入栈中,当碰到加减乘除时,将这两个数出栈 最后进行相乘,将新值压入栈中,碰到数值就进行压栈,下一个数为5.99将数压栈,后面为+号,将5.99和新值出栈,进行相加,得来的新值压栈,后面为6.99将数压栈,最后将1.06压栈,碰到*号.在之前我们将6.99和1.06进行了压栈,栈的形式就是先进后出,所以将6.99*1.06得来的值压栈,碰到加法,将6.99和1.06得来的值和原先的值进行相加结果为:18.6888最后为18.69(进位).

结束符为#.

如果程序有问题请私信告知.

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define SIZE 50
struct Stack {
	double pointed;
	struct Stack* next;
};

typedef struct Stack* Stack_t;

void IStack(Stack_t* stack_t);
void Posh(Stack_t* stack_t,double val);
double Pop(Stack_t* stack_t);
int stackSize(Stack_t stack_t);
void DeleteStack(Stack_t *stack_t);

int main(void) {
	double point_t, point_c,val;
	Stack_t stack_t;
	IStack(&stack_t);
	char str[SIZE];
	char ch;
	int i = 0;
	while ((ch = getchar()) != '#') {
		if (isdigit(ch) || ch == '.') {
			str[i++] = ch;
			str[i] = '\0';
		}
		else if (ch == ' ') {
			if (str[0] == '\0')
				continue;
			val = atof(str);/*该函数将字符串转换为浮点数*/
			Posh(&stack_t, val);
			i=0;
			str[i]='\0';/*及时将数据清除,存下一个数据*/
			continue;
		}
		switch (ch) {
		case '+':
			point_t = Pop(&stack_t);
			point_c = Pop(&stack_t);
			Posh(&stack_t, point_t + point_c);
			break;
		case '-':
			point_t = Pop(&stack_t);
			point_c = Pop(&stack_t);
			Posh(&stack_t, point_c - point_t);
			break;
		case '*':
			point_t = Pop(&stack_t);
			point_c = Pop(&stack_t);
			Posh(&stack_t, point_t * point_c);
			break;
		case '/':
			point_t = Pop(&stack_t);
			point_c = Pop(&stack_t);
			if(point_c != 0)
			Posh(&stack_t, point_c / point_t);
			break;
		}
	}
	point_t = Pop(&stack_t);
	printf("%.2lf",point_t);/*小数的话比如6.87可以是6.9*/
	return 0;
}
/*初始化*/
void IStack(Stack_t* stack_t) {
	*stack_t = NULL;
}
/*查看栈是否为空*/
int stackSize(Stack_t stack_t) {
	return stack_t == NULL;
}
/*压栈*/
void Posh(Stack_t* stack_t,double val) {
	Stack_t stack_c=(Stack_t)malloc(sizeof(struct Stack));
	Stack_t stack_v = *stack_t;
	stack_c->pointed = val;
	stack_c->next = NULL;
	if (stack_v == NULL)
		*stack_t = stack_c;
	else {
		stack_c->next = *stack_t;
		*stack_t = stack_c;
	}
}
/*出栈*/
double Pop(Stack_t* stack_t) {
	Stack_t stack_c=NULL;
	if (stackSize(*stack_t)) {
		printf("栈为空\n");
		exit(1);
	}
	double point = (*stack_t)->pointed;
	stack_c = (*stack_t);
	*stack_t = stack_c->next;
	free(stack_c);
	return point;
}
/*删栈*/
void DeleteStack(Stack_t* stack_t) {
	Stack_t stack_c = *stack_t;
	while (*stack_t != NULL) {
		*stack_t = stack_c->next;
		free(stack_c);
		stack_c = *stack_t;
	}
}

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值