数据结构学习(栈与队列:五(延迟缓冲))

这篇博客探讨了如何实现表达式的求值,包括读取数字到栈中以及处理运算符的优先级。orderBetween函数利用了一个优先级表来判断运算符之间的关系,而readNumber函数则将字符序列解析为数值。此外,还提供了由操作符转译出编号的函数optr2rank。这些功能对于理解编译原理和解释器的构建至关重要。
摘要由CSDN通过智能技术生成

延迟缓冲

表达式求值

下面给出上一届代码中orderBetween()函数与readNumber()函数:

void readNumber(char*& p, Stack<float>& stk)
{ //将起始于p的子串解析为数值,并存入操作数栈
	stk.push((float) (*p - "0"));//当前数位对应的数值进栈
	while (isdigit(*(++p))) //只要后面还有紧邻的数字(即多位整数的情况),则
		stk.push(stk.pop*10 + (*p - "0")); //弹出原操作数并追加新数位后,新数值重新入栈
	if("." != *p) return; //此后非数点,则意味着当前操作数解析完成
	float fraction = 1;//否则,意味着还有小数部分
	while(isdigit(*(++p)))//逐位加入
		stk.push(stk.pop() + (*p - "0") * (fraction /= 10));//小数部分
}

关于orderBetween’函数,需要利用事先规定的优先级表:

#define N_OPTR 9 //运算符总数
typedef enum { ADD, SUB, MUL, DIV, POW, FAC, L_P, R_P, EOE } Operator; //运算符集合
//加、减、乘、除、乘方、阶乘、左括号、右括号、起始符与终止符

const char pri[N_OPTR][N_OPTR] = { //运算符优先等级 [栈顶] [当前]
    /*              |-------------------- 当 前 运 算 符 --------------------| */
    /*              +      -      *      /      ^      !      (      )      \0 */
    /* --  + */    '>',   '>',   '<',   '<',   '<',   '<',   '<',   '>',   '>',
    /* |   - */    '>',   '>',   '<',   '<',   '<',   '<',   '<',   '>',   '>',
    /* 栈  * */    '>',   '>',   '>',   '>',   '<',   '<',   '<',   '>',   '>',
    /* 顶  / */    '>',   '>',   '>',   '>',   '<',   '<',   '<',   '>',   '>',
    /* 运  ^ */    '>',   '>',   '>',   '>',   '>',   '<',   '<',   '>',   '>',
    /* 算  ! */    '>',   '>',   '>',   '>',   '>',   '>',   ' ',   '>',   '>',
    /* 符  ( */    '<',   '<',   '<',   '<',   '<',   '<',   '<',   '=',   ' ',
    /* |   ) */    ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',   ' ',
    /* -- \0 */    '<',   '<',   '<',   '<',   '<',   '<',   '<',   ' ',   '='
 };

有了这个表,便可以进行优先级的判断:

Operator optr2rank(char op)
{//由操作符转译出编号
	switch(op)
	{
		case'+' : return ADD;//加
		case'-' : return SUB;//减
		case'*' : return ADD;//乘
		case'/' : return ADD;//除
		case'^' : return ADD;//乘方
		case'!' : return ADD;//阶乘
		case'(' : return ADD;//左括号
		case')' : return ADD;//右括号
		case'\0' : return ADD;//起始符与终止符
		default : exit(-1);//位置运算符
	}
}

char orderBetween(char op1, char op2)//比较两个操作符之间的优先级
{
	return pri[optr2rank(op1)][]optr2rank(op2)];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值