站外题求助!!
  • 板块题目总版
  • 楼主Register_int-std=c++14
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/7/6 16:58
  • 上次更新2023/11/4 18:32:33
查看原帖
站外题求助!!
406941
Register_int-std=c++14楼主2021/7/6 16:58

题目

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,t,f = 1;
bool flag;
stack<int>num;
stack<char>op;
char expr[10010];
int sum[10010];
int lvl(char op){
	if(op == '+' || op == '-') return 1;
	if(op == '*' || op == '/') return 2;
	if(op == '^') return 3;
	return 0;
}
int pow(int x,int y){
	int res = 1;
	for(int i = 1; i <= y; i++) res *= x;
	return res;
}
void calc(){
	int y = num.top();num.pop();
	int x = num.top();num.pop();
	switch(op.top()){
		case '+':num.push(x + y);break;
		case '-':num.push(x - y);break;
		case '*':num.push(x * y);break;
		case '/':num.push(x / y);break;
		case '^':num.push(pow(x,y));break;
	}
	op.pop();
}
int main(){
	scanf("%s",expr + 1);
	n = strlen(expr + 1) - 1;
	for(int i = 1; i <= n; i++){
		sum[i] = sum[i - 1];
		if(expr[i] == '(') sum[i]++;
		if(expr[i] == ')') sum[i]--;
	}
	for(int i = 2; i <= n; i++){
		if(lvl(expr[i]) && lvl(expr[i - 1]) && expr[i] != '-'){
			flag = 1;break;
		}
	}
	if(lvl(expr[n])) flag = 1;
	if((n == 1 && lvl(expr[1])) || sum[n] || flag) return 0 * puts("NO");
	for(int i = 1; i <= n; i++){
		if((i == 1 || !isdigit(expr[i - 1])) && expr[i] == '-'){
			f = -1;continue;
		}
		if(isdigit(expr[i])) t = t * 10 + expr[i] - 48,flag = 1;
		else{
			if(flag) num.push(t * f),t = flag = 0,f = 1;
			if(expr[i] == '('){op.push('(');continue;}
			if(expr[i] == ')'){
				while(op.top() != '(') calc();
				op.pop();
				continue;
			}
			while(!op.empty() && lvl(op.top()) >= lvl(expr[i])) calc();
			op.push(expr[i]);
		}
	}
	if(flag) num.push(t * f);
	while(!op.empty()) calc();
	printf("%d",num.top());
}

80pts代码

2021/7/6 16:58
加载中...