题解:AT_colopl2018_final_b 異世界数式

题意简单易懂,就是把另一种特殊的数学表达式转化成中缀表达式。

这一题,我们可以使用一个栈来进行操作,这个栈用于存储正在处理的运算符号。

我们遍历特殊表达式,当我们遇到括号时,即可按照题意直接输出括号。当遇到运算符号的时候,这个就是我们现在要处理的运算符号,我们把它入栈。而且这些数字并列,用都好隔开,他们需要的运算符号就是栈顶符号,所以遇到逗号我们直接输出栈顶运算符即可。注意一点,就是每次运算完成后(即遇到右括号),这个运算符就用完了,需要出栈。而数字只需直接输出。

这就是全部过程,简单梳理一下步骤:

  • 遇到左括号或者数字,直接输出
  • 遇到右括号,输出自身并弹出栈顶元素
  • 遇到运算符,直接入栈
  • 遇到逗号,输出栈顶运算符

这样子时间复杂度仅仅 \(O(n)\),绝对不会超时。

code

简单易懂

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
string a; //存储特殊表达式
stack <char> st; //存储当前需处理的运算符
int main() {
	cin >> a; //先输入特殊表达式
	for (int i = 0 ; i < a.size() ; i++) {
		//遍历特殊表达式,按照刚才的步骤处理
		char c = a[i]; //当前遍历到的字符
		if (c == '(') {
			// 如果是左括号,直接输出
			cout << c;
		} else if (c == '+' || c == '-' || c == '*' || c == '/') {
			//如果是运算符,直接入栈
			st.push(c);
		} else if (c == ',') {
			// 如果是逗号,输出栈顶运算符
			cout << st.top();
		} else if (c == ')') {
			// 如果是右括号,输出并弹出栈顶元素
			cout << c;
			st.pop();
		} else {
			// 否则肯定是数字,直接输出
			cout << c;
		}
	}
	return 0;
}

当然这么多分支写起来有点累的,我们可以简化一下。

简化版:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
string a; //存储特殊表达式
stack <char> st; //存储当前需处理的运算符
int main() {
	cin >> a; //先输入特殊表达式
	for (int i = 0 ; i < a.size() ; i++) {
		//遍历特殊表达式,按照刚才的步骤处理
		char c = a[i]; //当前遍历到的字符
		if (c == '+' || c == '-' || c == '*' || c == '/') {
			// 如果是运算符号,直接入栈
			st.push(c);
		} else if (c == ')') {
			// 如果是右括号,输出并弹出栈顶元素
			cout << c;
			st.pop();
		} else if (c == ',') {
			// 如果是逗号,输出栈顶运算符
			cout << st.top();
		} else {
			// 是数字或左括号,直接输出
			cout << c;
		}
	}
	return 0;
}
posted @ 2025-08-27 15:23  fengjunxiao2014  阅读(9)  评论(0)    收藏  举报