后缀表达式求值——顺序栈

一、定义:逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)

二、执行过程:

  1. 当遇到数值时入栈;
  2. 当遇到运算符时,连续两次出栈,将两个出栈元素结合运算符进行运算,将得到的结果入栈;
  3. 如此往复直至扫描到终止符'\0'。此时栈底元素即为表达式的值。

三、代码实现:

int Op(int a, char op, int b)  //运算函数
{
	if(op == '+') return a+b;
	if(op == '-') return a-b;
	if(op == '*') return a*b;
	if(op == '/')
	{
		if(b == 0)
		{
			cout << "Error" <
int com(char exp[])  //后缀式计算函数
{
	int i, a, b, c;
	char op;  //当前运算符
	
	int stack[MAXSIZE];   //栈的定义及初始化
	int top = -1;
	
	for(i = 0; exp[i] != '\0'; ++i)
	{
		if(exp[i] >= '0' && exp[i] <= '9')   //如果扫描到操作数
		{
			a = exp[i] - '0';
			stack[++top] = a;
		}
		else      //如果扫描到运算符
		{
			op = exp[i];
			a = stack[top--];
			b = stack[top--];
			c = Op(a , op, b);
			stack[++top] = c;
		}
	}
	return stack[top];
}

四、中缀转后缀规则:
1.遇到操作数:添加到后缀表达式中或直接输出
2.栈空时:遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,输出到后缀表达式,直到弹出的是左括号
注意:左括号不输出到后缀表达式
5.遇到其他运算符:弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈
6.将栈中剩余内容依次弹出后缀表达式

具体实现详见:https://blog.csdn.net/coder_dacyuan/article/details/79941743

你可能感兴趣的:(考研,数据结构,栈&队列)