栈的应用的后缀表达式((186-56)/(4+2)*2的后缀表达式计算)

*本文为(186-56)/(4+2)2的后缀算法的设计与实现

(此处采用的是顺序栈的存储结构)
运行结果为
在这里插入图片描述

栈的顺序存储结构以及基本运算


typedef struct {
	ElemType data[MaxSize];
	int top;

}SqStrack;

//(1)初始化栈
SqStrack* InitStrack() {
	SqStrack* s = (SqStrack*)malloc(sizeof(SqStrack));
	s->top = -1;
	return s;

}
//(2)销毁栈
void DestroyStract(SqStrack* s) {
	free(s);
}
//(3)判断栈是否为空
bool StactEmpty(SqStrack* s) {
	return(s->top == -1);
}
//(4)进栈
bool Push(SqStrack* s, ElemType e) {
	if (s->top == MaxSize - 1)
		return false;
	s->top++;
	s->data[s->top] = e;
	return true;


}
//(5)出栈
bool Pop(SqStrack* s, ElemType &e) {
	if (s->top == -1)
		return false;
	e = s->data[s->top];
	s->top--;
	return true;

}
//(6)取栈顶元素
bool GetTop(SqStrack* s, ElemType &e) {
	if (s->top == -1)
		return false;
	e = s->data[s->top];
	return true;
}


此处代码与compvalue()的顺序栈的存储结构,调用差不多,就不过多叙述,只需多加1(push1()这种样子修改)。

中缀表达式"(186-56)/(4+2)*2"转换为后缀表达式的基本过程

void trans(char* exp, char postexp[]) {
	char e;
	SqStrack* Optr= InitStrack();
	int temp = 0;
	int i = 0;
	int j = 0;
	while (exp[j] != '\0') {
		//TODO
		switch (exp[j]) {
		case '(':
			//TODO
			Push(Optr, '(');
			j++;
			break;
		case ')':
			//TODO
			Pop(Optr, e);
			while (e != '(') {
				postexp[i++] = e;
				Pop(Optr, e);
				//TODO
			}
			j++;
			break;
		case '+':
		case '-':
			while (!StactEmpty(Optr)) {
				//TODO
				Pop(Optr, e);
				if (e != '(') {
					//TODO
					postexp[i++] = e;
					Pop(Optr, e);

				}
				else {
					Push(Optr, e);
					break;
				}
			}
			Push(Optr, exp[j]);
			j++;
			break;
		case '*':
		case '/':
			while (!StactEmpty(Optr)) {
				//TODO
				Pop(Optr, e);
				if (e != '(' &&  e !='+' && e != '-') {
					//TODO
					postexp[i++] = e;
					Pop(Optr, e);

				}
				else {
					Push(Optr, e);
					break;
				}
			}
			Push(Optr, exp[j]);
			j++;
			break;

		default:
			//TODO
			if (exp[j] >= '0' && exp[j] <= '9') {
				while (exp[j] >= '0' && exp[j] <= '9') {
				//TODO
				postexp[i++] = exp[j];
				j++;
				}
				postexp[i++] = '#';
			}
			else
				j++;

			break;
		}
	}
	while (!StactEmpty(Optr)) {
		//TODO
		Pop(Optr, e);
		postexp[i++] = e;
	}
	postexp[i] = '\0';
	DestroyStract(Optr);
} 

后缀表达式“186#56#-4#2#+/2#*”的求值过程

double compvalue(char* postexp) {

	double d, a, b, c, e;
	//	SqStrack1 * Opnd;
	SqStrack1* Opnd= InitStrack1();

	while (*postexp != '\0') {
		//TODO
		switch (*postexp) {
		case '+':
			//TODO
			Pop1(Opnd, a);
			Pop1(Opnd, b);
			c = a + b;
			Push1(Opnd, c);
			break;
		case '-':
			//TODO
			Pop1(Opnd, a);
			Pop1(Opnd, b);
			c = b - a;
			Push1(Opnd, c);
			break;
		case '*':
			//TODO
			Pop1(Opnd, a);
			Pop1(Opnd, b);
			c = b * a;
			Push1(Opnd, c);
			break;
		case '/':
			//TODO
			Pop1(Opnd, a);
			Pop1(Opnd, b);
			if (a != 0) {
				//TODO
				c = b / a;
				Push1(Opnd, c);
				break;
			}
			else
			{
				printf("\n\t除零错误!\n");
				exit(0);
			}

			break;
		default:
			//TODO
			d = 0;
			while (*postexp >= '0' && *postexp <= '9') {
				//TODO
				d = 10 * d + *postexp - '0';
				postexp++;

			}
			Push1(Opnd, d);
			break;
		}
		postexp++;
	}
	GetTop1(Opnd, e);
	DestroyStract1(Opnd);
	return e;
}

主函数调用上述的算法

int main(){
	//
	char exp[]="(186-56)/(4+2)*2";
	char postexp[MaxSize];
	trans(exp,postexp);
	
	printf("中缀表达式:%s\n",exp);
	printf("后缀表达式:%s\n",postexp);
	printf("表达式的值:%g\n",compvalue(postexp));
	return 1; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值