欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-23 23:15:07
...

延迟缓冲

表达式求值

下面给出上一届代码中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)];
}
相关标签: 栈与队列