利用栈来完成表达式求值

利用栈来完成表达式求值

一个表达式要求值,分为操作数部分和运算符部分,求值的过程便是运算符对操作数进行操作。
首先我们定义两个栈,一个栈存放运算符,先放个#进去,代表开始,然后记得结束最后一个字符也是#,这样代表结束。然后建立一个栈存放操作数。
算法:
定义一个字符来getchar字符,然后判断。首先判断这是字符是不是#或者现在运算符栈的top是不是#,如果两个都是#那么运算完成。
然后判断,不是运算符的话就存入操作数栈内
如果是运算符,那么判断,这个运算符与现在运算符栈top位置的运算符的关系,两者的优先性,根据优先性来进行下一步操作
比如top位置是‘-‘,然后字符是‘)’,那么在运算符栈内肯定有一个“(”与字符‘)’对应,如果没有,那么肯定输入有问题。因为有’(‘在栈内所以‘-’的优先性是大于‘)’的,获得字符‘>’所以进行运算,也就是减。首先从操作数里面取top出来,作为减数,然后top–,然后再取top作为被减数,因为存放顺序的关系,先进去的肯定是在前面。然后在字符“>”的情况下是不进行getchar的,因为也就进行了运算,所以现在字符还是‘)’,然后现在运算符栈内的就是‘(’,如果不是,那么继续运算,因为可能出现(7+2+2)这种,那么多算一次‘>’的情况就行。然后(与)判断结果是=,让运算符栈内(消掉,然后现在括号内的运算已经完毕,然后getchar获取下一个字符,继续进行判断!

代码可以直接运行

#include"consts.h"

typedef struct {
   
	char S[100];
	int top;
}CHARStack;

void InitStack(CHARStack *S) {
   
     S->top = -1;
}
void Push(CHARStack* S, char ch) {
   
	if (S->top >= 99) {
   
		printf("栈满!\n");
		exit(0);
	}
	else {
   
		S->top++;
		S->S[S->top] = ch;
	}
}
char GetTop(CHARStack* S) {
   
	if (S->top==-1) {
   
		printf("栈空!\n");
		exit(0);
	}
	else {
   
		
		return S->S[S->top];
	}
}

int TRIn(char ch) {
                              //是运算符就返回1,不是运算符返回0
	if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#') {
   
		return 1;
	}
	else return 0;
}


char Precede(char ch1, char ch2) {
   
	if (ch1 == '+') {
   
		if (ch2 == '+')return '>';
		if (ch2 == '-')return '>';
		if (ch2 == '*')return '<';
		if (ch2 == '/')return '<';
		if (ch2 == '(')return '<';
		if (ch2 == ')')return '>';
		if (ch2 == '#')return '>';
	}
	else if 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值