直接用栈的常规方法完成本题
查看原帖
直接用栈的常规方法完成本题
1599296
jhliwenhao楼主2024/12/28 10:04

处理后缀表达式的核心步骤及原理

  1. 扫描表达式 从左到右依次扫描后缀表达式的每一个元素(操作数或运算符)。
  2. 操作数处理 当扫描到的元素是操作数时,直接将其压入栈中。例如,对于后缀表达式 “3 4 +”,扫描到 “3” 和 “4” 这两个操作数时,就依次把它们压入栈中。这样,栈中就存储了后续运算所需要的操作数,方便后续取用。
  3. 运算符处理 当扫描到的元素是运算符时,需要从栈中弹出相应数量的操作数进行运算。具体来说: 双目运算符(如 +、-、*、/ 等): 需要从栈中弹出两个操作数,按照运算符的规则进行计算。例如,对于后缀表达式 “3 4 +”,扫描到 “+” 运算符时,从栈顶依次弹出 “4” 和 “3”(注意弹出顺序,后入栈的先弹出,符合运算顺序要求),然后进行加法运算(3 + 4),得到结果 7,再将这个结果压入栈中,以便后续可能的进一步运算。 单目运算符(如取负 - 等): 只需从栈中弹出一个操作数,进行相应运算后将结果压回栈中。比如对于后缀表达式 “3 -”(这里假设 “-” 表示取负操作),扫描到 “-” 时,从栈中弹出 “3”,对其取负得到 “-3”,再将 “-3” 压入栈中。
  4. 持续扫描与运算 继续按照上述规则扫描后缀表达式的后续元素,不断进行操作数压栈、运算符弹栈运算并压入结果的操作,直到整个后缀表达式扫描完毕。
  5. 获取最终结果 当整个后缀表达式都处理完后,栈中剩下的唯一元素就是该表达式运算的最终结果,将其从栈中弹出即可得到结果。 原理总结 处理后缀表达式利用栈的 “后进先出” 特性,操作数按顺序压入栈中,运算符根据其需要的操作数数量从栈中获取相应元素进行运算,并把结果再压回栈中,通过依次扫描和按规则运算,最终能高效且准确地得到表达式的计算结果,避免了中缀表达式中括号带来的运算顺序判断复杂性等问题。 示例 以下是处理后缀表达式 “5 3 + 2 ” 的完整过程示例: 扫描到 “5”,是操作数,将其压入栈中,此时栈内元素为:[5]。 扫描到 “3”,是操作数,压入栈中,此时栈内元素为:[5, 3]。 扫描到 “+”,是双目运算符,从栈中弹出 “3” 和 “5”,进行加法运算(5 + 3 = 8),将结果 “8” 压入栈中,此时栈内元素为:[8]。 扫描到 “2”,是操作数,压入栈中,此时栈内元素为:[8, 2]。 扫描到 “”,是双目运算符,从栈中弹出 “2” 和 “8”,进行乘法运算(8 × 2 = 16),将结果 “16” 压入栈中,此时栈内元素为:[16]。 整个后缀表达式扫描完毕,栈中剩下的元素 “16” 就是最终结果。

AC代码

#include <bits/stdc++.h>
using namespace std;
string a;
stack<int> q;
int main() {
	while(!q.empty()) {
		q.pop();
	}
	cin>>a;
	for(int i=0; i<a.size(); i++) {
		if(isdigit(a[i])) {
			int j,x=a[i]-'0';
			for(j=i+1; j<a.size()&&isdigit(a[j]); j++) {
				x=x*10+(a[j]-'0');
			}
			i=j-1;
			q.push(x);
		} else if(a[i]=='-') {
			if(q.size()>1) {
				int t1=q.top();
				q.pop();
				int t2=q.top();
				q.pop();
				q.push(t2-t1);
			} else {
				int t1=q.top();
				t1=-t1;
				q.push(t1);
			}
		} else if(a[i]=='+') {
			if(q.size()>1) {
				int t1=q.top();
				q.pop();
				int t2=q.top();
				q.pop();
				q.push(t1+t2);
			}
		} else if(a[i]=='/') {
			int t1=q.top();
			q.pop();
			int t2=q.top();
			q.pop();
			q.push(t2/t1);
		} else if(a[i]=='*') {
			int t1=q.top();
			q.pop();
			int t2=q.top();
			q.pop();
			q.push(t1*t2);
		} else {
			continue;
		}
	}
	printf("%d",q.top());
	return 0;
}
2024/12/28 10:04
加载中...